イメージバッファにアクセスする - RGB32 -
RGB32は32bit、カラーのフォーマットです。RGB24と似ていますが、全てのピクセルがアルファ値を保持するためのバイトを余分にもっているところが違いです。アルファ値はピクセルの透過度を表す情報です。よって全てのピクセルは4バイトで構成されています。RGB32 は RGBAとも呼ばれます(アルファを表すAがつく) 。アルファ値はIC Imaging Control では使用されないため常に0となっています。RGB24 のピクセルフォーマットの場合と同様、IC Imaging Control ではRGB32 のピクセルフォーマットはBGRAというバイト順になっています。イメージバッファのピクセルは左から右へ、下から上へと組織されます。
ピクセルデータの読み込み、書き込みの方法
ここでその動作を示すため、まずは画像取り込みデバイス、ビデオフォーマット、 FrameSnapSinkクラスライブラリリファレンス>クラス>FrameSnapSinkを
準備します。 以下のコードはRGB32ピクセルデータにどようにアクセスし、操作するのかを順番に説明しています。
まず最初に、イメージバッファ内には何もありませんので、画像をキャプチャしなければなりません。そのためにライブ 表示を開始し、FrameSnapSink.SnapImageクラスライブラリリファレンス>クラス>FrameSnapSink>FrameSnapSink.SnapSingel Method
を呼び出し、GrabImageメソッドによってこれを行います。
バッファにアクセスする
イメージバッファのデータにアクセスするために、BufferAccessHelperのインスタンスを作成します。そうすることで、buf[column,line]として個別のデータにアクセスできます。
今回の例では、画像中の最初の(一段左上から)2ピクセル分の読み出しをします。 次のステップでは最初の3ピクセルを扱います。RGB画像は下から上に保存されるため、最初のラインのインデックスはilines-1となります。
ピクセルデータのX座標を計算するため、1ピクセルあたりに必要なバイト数(4)に取得される縦のピクセルを掛けます。その後、ピクセルのRedかGreen,もしくはBlueコンポーネントにアクセスするためのオフセットが加えられます。
// RGB32 は下から 上へデータが記述されているのでラインのインデックスはlines-1となる
int y = frame.FrameType.Height - 1;
txtOutput.Text = "Image buffer pixel format is RGB32\r\n";
txtOutput.Text += "Pixel 1: ";
txtOutput.Text += "R=" + buf[0 * 4 + 2, y] + ", ";
txtOutput.Text += "G=" + buf[0 * 4 + 1, y] + ", ";
txtOutput.Text += "B=" + buf[0 * 4 + 0, y] + "\r\n";
txtOutput.Text += "Pixel 2: ";
txtOutput.Text += "R=" + buf[1 * 4 + 2, y] + ", ";
txtOutput.Text += "G=" + buf[1 * 4 + 1, y] + ", ";
txtOutput.Text += "B=" + buf[1 * 4 + 0, y];
画像データを操作する
ピクセルデータは読み込みだけでなく、データを操作する事も可能です。 次のコードは左上のピクセルをRedに、それに続くピクセルをそれぞれGreen,Blueに設定します。この変更を加えた後、画像はBMPファイルとして保存されます。
// 最初のピクセル を red (255 0 0)に
buf[0 * 4 + 2, y] = 255;
buf[0 * 4 + 1, y] = 0;
buf[0 * 4 + 0, y] = 0;
// 2番目のピクセルを green (0 255 0)に
buf[1 * 4 + 2, y] = 0;
buf[1 * 4 + 1, y] = 255;
buf[1 * 4 + 0, y] = 0;
// 3番目のピクセルを Blue (0 0 255)に
buf[2 * 4 + 2, y] = 0;
buf[2 * 4 + 1, y] = 0;
buf[2 * 4 + 0, y] = 255;
TIS.Imaging.FrameExtensions.SaveAsBitmap(frame, "RGB32.bmp");
結果をチェックするために保存された画像を開き、左上のピクセルを見てください。次のように表示されるかと思います。