イメージバッファにアクセスする - RGB24 -

RGB24は24bit 、カラーのフォーマットです。 すべてのピクセルが3バイトで表されますが、1バイトがそれぞれ1色の値に対応します。'RGB' は それぞれRed (赤)、Green (緑)、Blue (青) を意味し、 3つのバイトがそれぞれRed, Green, Blueの値を表しているということになります。
RGB という呼び方は誤解を招く可能性があるかもしれません。というのもピクセルの最初のバイトが必ずしもRedの値を表すということではないためです。Windows© 環境においては、RGB データは大抵BGRの順に並んでいます。つまり最初のバイトがBlue,次にGreen, Redとなっているということです。IC Imaging Control はBGR 順になっており、イメージバッファのピクセルは左から右へ、下から上へと組織されます。

ピクセルデータの読み込み、書き込みの方法

画像取り込みデバイス、ビデオフォーマット、 FrameHandlerSinkクラスライブラリリファレンス>クラス>FrameHandlerSinkImageBuffersクラスライブラリリファレンス>クラス>FrameHandlerSink>FrameHandlerSink.ImageBuffers Property コレクション, これら画像データのカラーフォーマットを定義するためのものが全てセットアップされてなければなりません。以下のコードはRGB24ピクセルデータにどようにアクセスし、調整するのかを順番に説明しています。
まず最初に、イメージバッファ内には何もありませんので、画像をキャプチャしなければなりません。そのためにライブ表示を開始し、FrameHandlerSink.SnapImageクラスライブラリリファレンス>クラス>FrameHandlerSink>FrameHandlerSink.SnapImage Method を呼び出します。

バッファにアクセスする

イメージバッファのデータにアクセスするために、C# なら buf[column,line]、VB.NETであれば buf(column,line)を記述します。
今回の例では、画像中の最初の(一段左上から)2ピクセル分の読み出しをします。 次のステップでは最初の3ピクセルを扱います。RGB 画像は下から上に保存されるため、最初のラインのインデックスはilines-1となります。
ピクセルデータのX座標を計算するため、1ピクセルあたりに必要なバイト数(3)に取得される縦のピクセルを掛けます。その後、ピクセルのRedかGreen,もしくはBlueコンポーネントにアクセスするためのオフセットが加えられます。

[VB.NET]
' RGB24 はボトムアップなので最初のラインのインデックスはlines-1となります。
Dim y As Integer = buf.Lines - 1

txtOutput.Text = "Image buffer pixel format is RGB24" & vbCrLf txtOutput.Text &= "Pixel 1: "
txtOutput.Text &= "R=" & buf(0 * 3 + 2, y) & ", ="
txtOutput.Text &= "G=" & buf(0 * 3 + 1, y) & ", ="
txtOutput.Text &= "B=" & buf(0 * 3 + 0, y) & vbCrLf
txtOutput.Text &= "Pixel 2: "
txtOutput.Text &= "R=" & buf(1 * 3 + 2, y) & ", ="
txtOutput.Text &= "G=" & buf(1 * 3 + 1, y) & ", ="
txtOutput.Text &= "B=" & buf(1 * 3 + 0, y)
[C#]
// RGB24 はボトムアップなので最初のラインのインデックスはlines-1となります。
int y = buf.Lines - 1;

txtOutput.Text = "Image buffer pixel format is RGB24\r\n";
txtOutput.Text += "Pixel 1: ";
txtOutput.Text += "R=" + buf[0 * 3 + 2, y] + ", =";
txtOutput.Text += "G=" + buf[0 * 3 + 1, y] + ", =";
txtOutput.Text += "B=" + buf[0 * 3 + 0, y] + "\r\n";
txtOutput.Text += "Pixel 2: ";
txtOutput.Text += "R=" + buf[1 * 3 + 2, y] + ", =";
txtOutput.Text += "G=" + buf[1 * 3 + 1, y] + ", =";
txtOutput.Text += "B=" + buf[1 * 3 + 0, y];

画像データを調整する

ピクセルデータの読み込みを行うだけでなく、データを調整するという事も可能です。 次のコードは左上のピクセルをRedに、それに続くピクセルをそれぞれGreen, Blueに設定します。この変更を加えた後、画像はBMPファイルとして保存されます。

[VB.NET]
' 最初のピクセルを red (255 0 0)に
buf(0 * 3 + 2, y) = 255
buf(0 * 3 + 1, y) = 0
buf(0 * 3 + 0, y) = 0
' 2番目のピクセルを green (0 255 0)に
buf(1 * 3 + 2, y) = 0
buf(1 * 3 + 1, y) = 255
buf(1 * 3 + 0, y) = 0
' 3番目のピクセルを Blue (0 0 255)に
buf(2 * 3 + 2, y) = 0
buf(2 * 3 + 1, y) = 0
buf(2 * 3 + 0, y) = 255

buf.SaveAsBitmap("RGB24.bmp")
[C#]
// 最初のピクセルを red (255 0 0)に
buf[0 * 3 + 2, y] = 255;
buf[0 * 3 + 1, y] = 0;
buf[0 * 3 + 0, y] = 0;
// 2番目のピクセルを green (0 255 0)に
buf[1 * 3 + 2, y] = 0;
buf[1 * 3 + 1, y] = 255;
buf[1 * 3 + 0, y] = 0;
// 3番目のピクセルを Blue (0 0 255)に
buf[2 * 3 + 2, y] = 0;
buf[2 * 3 + 1, y] = 0;
buf[2 * 3 + 0, y] = 255;

buf.SaveAsBitmap("RGB24.bmp");

結果をチェックするために保存された画像を開き、左上のピクセルを見てください。次のように表示されるかと思います。