イメージバッファにアクセスする - RGB32-
RGB32は32bit、カラーのフォーマットです。RGB24と似ていますが、全てのピクセルがアルファ値を保持するためのバイトを余分にもっているところが違いです。アルファ値はピクセルの透過度を表す情報です。よって全てのピクセルは4バイトで構成されています。RGB32 は RGBAとも呼ばれます(アルファを表すAがつく) 。アルファ値はIC Imaging Control では使用されないため常に0となっています。RGB24 のピクセルフォーマットの場合と同様、IC Imaging Control ではRGB32 のピクセルフォーマットはBGRAというバイト 順になっています。 イメージバッファのピクセルは左から右へ、下から上へと組織されます。
ピクセルデータの読み込み、書き込みの方法
画像取り込みデバイス、ビデオフォーマット、 画像データのカラーフォーマットを定義するMemBufferCollectionクラスライブラリリファレンス>クラス>MemBufferCollectionを持つFrameHandlerSinkクラスライブラリリファレンス>クラス>FrameHandlerSinkがセットアップされている必要があります。下記ではRGB32のピクセルデータにどようにアクセスし、操作するかを順番に説明しています。
まず最初に、イメージバッファ内には何もありませんので、画像をキャプチャしなければなりません。そのためにライブ表示を開始しGrabber::snapImagesクラスライブラリリファレンス>クラス>Grabber>Grabber::snapImages Methodをコールします
バッファにアクセスする
次のコードは画像データへの1バイトのポインタを取得します。windows.hにおいて宣言される構造体RGBQUADを使ってピクセルのコンポーネントにアクセスし、RGB8のレベルまで座標計算量を減らします。
RGBQUAD* pbImgData = (RGBQUAD*)pActiveBuf->getPtr();
今回の例では、画像中の(左上から)最初の2ピクセル分の読み出した後、3ピクセル分を操作します。先ほど説明したようにRGB 画像は下から上に保存されるため、pbImgDataはイメージの最後の行の最初のピクセルをポイントします。1行目の最初のピクセルにアクセスしたい場合には下記のようにして算出する必要があります。
// 左上のピクセルのインデックスを算出
// 画像はイメージバッファ内に上下逆に保存されます
SIZE dim = pActiveBuf->getFrameType().dim;
int iOffsUpperLeft = (dim.cy-1) * dim.cx;
まず最初に、画像の高さと幅をピクセル数で取得します。そして左上のピクセルへのオフセットが計算されます。全てのピクセルのサイズは1バイトなので、このように計算することができます。
(Height-1) * Width
最初のピクセルのオフセットを取得したので読み出します。
printf( "\nImage buffer pixel format is eRGB32\n" );
printf( "Pixel 1(RGBA): %d %d %d %d\n", pbImgData[iOffsUpperLeft].rgbRed,
pbImgData[iOffsUpperLeft].rgbGreen,
pbImgData[iOffsUpperLeft].rgbBlue,
pbImgData[iOffsUpperLeft].rgbReserved );
printf( "Pixel 1(RGBA): %d %d %d %d\n", pbImgData[iOffsUpperLeft+1].rgbRed,
pbImgData[iOffsUpperLeft+1].rgbGreen,
pbImgData[iOffsUpperLeft+1].rgbBlue,
pbImgData[iOffsUpperLeft+1].rgbReserved );
画像データを操作する
ピクセルデータの読み込みを行うだけでなく、データを操作するという事も可能です。次のコードは左上のピクセルをRed、そして次の2つのピクセルをそれぞれGreen、Blueとします。この操作後、画像をBMPファイルとして保存します。
// 最初の3つのピクセルを上書きしてディスクに画像を保存する
// 最初のピクセルをREDに設定
pbImgData[iOffsUpperLeft].rgbRed = 0xff;
pbImgData[iOffsUpperLeft].rgbGreen = 0;
pbImgData[iOffsUpperLeft].rgbBlue = 0;
pbImgData[iOffsUpperLeft].rgbReserved = 0;
// 2番目のピクセルをGREENに設定
pbImgData[iOffsUpperLeft].rgbRed = 0;
pbImgData[iOffsUpperLeft].rgbGreen = 0xff;
pbImgData[iOffsUpperLeft].rgbBlue = 0;
pbImgData[iOffsUpperLeft].rgbReserved = 0;
// 3番目のピクセルをBLUEに設定
pbImgData[iOffsUpperLeft].rgbRed = 0;
pbImgData[iOffsUpperLeft].rgbGreen = 0;
pbImgData[iOffsUpperLeft].rgbBlue = 0xff;
pbImgData[iOffsUpperLeft].rgbReserved = 0;
saveToFileBMP( *pActiveBuf, "RGB32.bmp" );
確認のために保存されたか画像の左上のピクセルを見てみましょう。このようになっているはずです。