Top > ComputerGraphics > ImageProcessing > TheStructureOfImageData
Last-modified: Fri, 21 Nov 2014 12:17:17 JST
Counter:23742 Today:1 Yesterday:8 Online:4
このエントリーをはてなブックマークに追加

0.画像データの構造

一般的な画像データの構造

0.png

 画像データは沢山の「画素(ピクセル)」の集合です。小さな色がいくつも繋がって画像になっています。ですから画像データは小さなデータの連続、つまり配列です。また画素は3色の値から構成されます。赤R・緑G・青Bです。画素がRGB(の配列)から構成されるということは、画像データはRGBの配列から構成されるということです。
 一般に、それらRGBの値はそれぞれ8bit(=1byte)で表されます。よって"24bitの画像データ"とは、RGBの値がそれぞれ8bitで表現される画像データという意味になります。8bitで表現される数値とは、10進数において0~255になります。つまりRGBの値は、それぞれ0~255の値で表されるということになります。また画像フォーマットの中には、その色がどれくらい透けているのかを示す「透過率α/A」を扱うもの、例えば「png形式」等があります。これは同様に、RGBに続いてRGBAと並んで画素を構成する情報で、一般に8bitで表されます。すなわちRGBと同じく0~255の値をとることになります。フォーマットには様々な種類があり、例えばBitmapにしてもAの値を扱うものや、扱わないにしても32bit(つまりAの部分は空)の場合があります。

1.png

 さてこのコンテンツでは上述した基本的な構造を示すBitmapデータを取り扱いますが、気を付けなければいけないことがあります。聞き慣れていることを考慮して、ここでは「RGB」と上述しましたが、実際のデータの順序は1次元配列で「BGR」の順に並んでいます。さらにサンプルプログラムにおいては32bitで扱われ、α値が与えられない画像フォーマットの場合は4byte目に空値「0」をとることに注意してください。

画像の座標系と大きさ

2.png

 一般に、画像上のある画素(ピクセル)の座標は、左上を原点とする座標系で定められます。ここで用いるサンプルの画像は、サイズが横x縦=512x512ですから、右下の画素の座標は(x,y)=(512,512)となります。
 ここでこの画像の画素数、大きさは「512 x 512 = 262144」と求めることができます。画像データは実際には1次元配列ですから、データの大きさ、つまり配列の長さも求めてみます。この画像は32bitつまり4byteで表現されているので、1画素あたり4byte分のデータを持っていることになります。よってこの画像をデータとして見たときの大きさ(配列の長さ)は次の様に求めることができます。

画像データの大きさ(配列の長さ)の求め方
縦・横幅がそれぞれ512px、RGBA各色8bit(32bitColor)で表現される画像の配列の長さは、
 512(px) * 512(px) * 4(byte = 32bit) = 1048576
の通り 1048576 となります。

ストライドと座標

3.png

 画像データには「ストライド(stride)」という重要な概念があります。画像は2次元データとして画面上に表現されますが、結局の所そのデータはコンピュータ内では1次元配列として管理されています。配列の中には縦幅や横幅の情報は含まれませんから、コンピュータがその1次元配列を2次元の画像として表示するためには、配列の内、何番目から何番目までがX座標1列分のデータであるかを示す必要があります。そこで用いられるのが「ストライド」という値です。
 「ストライド」は、画像データのX座標横一列あたりに用いられるbyte数を示す値です。例えば、サンプルの画像は幅が512pxの画像です。つまり512画素分のデータを表現するために用いられるbyte数がストライドになります。ストライドは次の様に求めることができます。

ストライドの求め方
横幅が512pxで、RGBA各色8bit(32bitColor)で表現される画像データのストライドは、
 512(px) * 4(byte = 32bit) = 2048
の通り2048となります。

 ストライドが得られると、ある座標にある画素のデータが配列の何番目(index)に保存されているかが分かるようになります。例えば (x,y) = (120,247) にある画素のRGB成分を、ストライドが2048の32bit画像データの配列の中から参照する場合は次の様にします。

座標に対応する配列のindexの求め方-1
120(x座標) * 2048(ストライド) + 4(画素あたりのbyte数) * 247(y座標) = 246748 247px * 2048(ストライド) + 4byte * 120px = 505856 + 480 = 506336 です。

 配列の「246748 ~ 246748 + 4」「506336 ~ 506336 + 3」番目に、画素(120,247)のRGB(A)成分が保存されていることが求められました。