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

Y800 は8bit、モノクロのフォーマットです。すべてのピクセルが1バイトで表されます。イメージバッファのピクセルは左から右へ、上から下へと組織されます。つまり、イメージバッファの1バイトめが映像における1番上のラインの最初のピクセルに対応しているということです。

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

画像取り込みデバイス、ビデオフォーマット、 画像データのカラーフォーマットを定義するMemBufferCollectionクラスライブラリリファレンス>クラス>MemBufferCollectionを持つFrameHandlerSinkクラスライブラリリファレンス>クラス>FrameHandlerSinkがセットアップされている必要があります。下記ではY800ピクセルデータにどようにアクセスし、操作するかを順番に説明しています。

まず最初に、イメージバッファ内には何もありませんので、画像をキャプチャしなければなりません。そのためにライブ表示を開始しFrameSnapSink::snapSingleクラスライブラリリファレンス>クラス>FrameSnapSink>FrameSnapSink::snapSingle Methodをコールします。

バッファにアクセスする

次のコードは画像データへの1バイトのポインタを取得します。

// 画像データへのポインタを取得
BYTE* pbImgData = pActiveBuf->getPtr();

今回の例では、画像中の(左上から)最初の2ピクセル分の読み出した後、3ピクセル分を操作します。Y800では上から下に保存されるので、最初の行のインデックスは0となります。

// 左上のピクセルのインデックスを算出
// イメージはバッファ内に上から下に保存されていくので最初のピクセルのインデックスは0
int iOffsUpperLeft = 0;

次のコードは画像データへの1バイトのポインタを取得します。

printf( "\nImage buffer pixel format is eY800\n" );
printf( "Pixel 1: %d\n", pbImgData[iOffsUpperLeft ] );
printf( "Pixel 2: %d\n", pbImgData[iOffsUpperLeft+1] );

画像データを操作する

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

// 最初の3つのピクセルを上書きしてディスクに画像を保存する
pbImgData[iOffsUpperLeft  ] = 0;    // 最初のピクセルを黒に
pbImgData[iOffsUpperLeft+1] = 128;    // 2番目のピクセルをグレーに
pbImgData[iOffsUpperLeft+2] = 255;    // 3番目のピクセルを白に

pActiveBuf->save( "Y800.bmp" );

確認のために保存されたか画像の左上のピクセルを見てみましょう。このようになっているはずです。