2015/3/8ここではC言語で画像を扱う方法について解説していこうと思う。プログラムの上でどのように画像を表現するかというところから決めていこうと思う。入出力の画像フォーマットに依存しない処理を作れるようにしたい。サンプル・コードしてここのソースコードを参照しながら解説していく予定である。今回は、image.hの説明となる。画像を扱う前にその構成要素である「色」をどう表現するかを決める。階調の取り方は様々あるかもしれないが、おそらく他の方法は余り考える必要はないだろう。これが色となると表現する方法は様々ある。Wikipediaにも様々な表現方法が説明されている。RGB、つまり、赤、緑、青の光の三原色各色の明るさで表現する方法が取られている。ここでも同様にRGBの情報が表現できるデータ形式を採用しようと思う。これも多くの場合、各色8bit、つまり256段階で表現する方法が一般的だ。0~255の範囲で数字が大きいほうが明るい。広く使われているのは256階調である。HTML/CSSにて色指定をする場合は、#ff0000といった16進数で24bitを使うのが普通である。実例で言うと、以下のように色を表現する。明るさと色成分を分離した輝度色差方式(YUVや、YCbCr、YPbPrと呼ばれる)が使われることがある。輝度に多くの情報を割り当て、色の情報を削減するという圧縮が一般に行われている。これらのフォーマットをデコードした結果をコンピュータ上で扱う場合は、やはりRGBに変換されることが多い。このRGB各色8bitのデータをC言語上で表現すると考えると、以下の様な構造体で表現するのが良いように思える。color_t;ここで、uint8_tはstdint.hで定義されている符号なし8bit整数である。厳密にビット数を明確化したい場合はこのような定義を利用する。符号付きのint8_tint16_tint32_tといったものが利用できる。通常はありえないが、全部が同じビット幅でも言語仕様上は間違いではない。charとも同一の型として扱えない。色の表現の仕方が決まったところで、次に画像1ピクセルの表現方法を考える。画像を構成する1ピクセルの色の表現方法となるともうひとつの要素を扱う場合がある。それは、アルファ値と呼ばれるもので、透過度を表すパラメータだ。複数の画像を重ねて表示する際に使用されて、この透過度を加味して、最終的な画像を合成することになる。アルファ値の表現方法は他のRGBに比べて、一般にはこう表現するというデファクトスタンダードな方法があまり明確ではない。0が完全な透明とするものもあれば、完全な不透明とするものもあったりする。同様の概念で「透明度」とするか「不透明度」とするかで分かれている。RGBは8bitで表現しても、アルファ値は0.0~1.0の浮動小数点数で表現するものもある。ここでは比較的多く採用されているだろう方法で表現することにする。RGBの各チャンネルと同じく、8bitで、0を完全な透明、255を完全な不透明とする表現方法である。このパラメータを追加して、以下の構造体でひとつの色を表現する。すると、ひとつの色を4byte=32bitで表現するという事になり、切りが良い。アルファチャンネルを含めたRGB色表現を、ARGBとかRGBAとかと表現する。color_t;インデックスカラー(カラーパレット)ひとつの色を表現する方法は決まった。画像フォーマットの中には、カラーパレットを使ったインデックスカラー方式のものがある。そのパレットの何番の色という情報だけを記述するようにした方式である。カラーパレットを使うという意味で、カラーパレット方式と表現される場合もある。使用する色の数が高々256色しかない場合、1ピクセルの情報が8bitで表現できる事になり、24bitカラーの3分の1ですむ。することで使用するメモリ量やファイルサイズを削減しようという方法だ。ファイルサイズにしても、pngなどの圧縮形式であれば、使用色数が同じならファイルサイズに違いはあまり出ない。この方式も扱えるようにしておいたほうが良いだろう。パレットの順序に意味がある場合、復元できなくなるので、そのまま保持できる方法があったほうが良い。一つのピクセルの色を表現する方式として、RGBAの他に、番号を指定する形でも表現できるようにする、ということを考える。実際のインデックスカラー方式の場合、カラーパレットの数は最大256色、つまり8bitで表現できるものがほとんどである。そこで、インデックス値として8bit整数が指定できるようにする。RGBAとインデックスカラー方式は排他利用なので、メモリは共有しても問題ない。いうことで、1ピクセルの表現として以下の様な共用体で表現することにする。pixcel_t;RGBAでは4byte消費し、インデックスカラーでは1byteの消費で、全体としては4byteの大きさの共用体になる。インデックスカラーをそのまま保持できるということが目的なのでこの方式とする。一つの指標で表現できるようにしたほうが便利な場合もある。これもまた別の表現方法として用意しておいたほうが良い。以下の共用体で表現することにする。別途、どのパラメータを使用するのかという情報が必要となる。画像の情報として一つ識別子があれば良い。更新情報2018/07/28lsっぽいコマンドを作る13アップしました。2018/07/13lsっぽいコマンドを作る12アップしました。2017/01/04lsっぽいコマンドを作る11アップしました。2017/01/03lsっぽいコマンドを作る10アップしました。(https://commoncrawl.org/faq/)。