かなり間が空いてしまいましたが、下記ネタの続きです。
この時は取得した画像のTimeStamp情報を表示させただけだったので、
今回は実際の画像を表示させてみます。
まずは、前回のソフト(上記リンク先参照)のForm上に、
PvGUIDotNetのPvDisplayControl を配置します、下記グレー部分。
表示させるだけなら、とても簡単
あとは取込スレッド内に一行追加するだけです。
(// Display Imageの次行)
コントロールの名称を”displayControl"としています、
displayControl.Displayに、取込バッファ(lbuffer)を指定するだけ。
// Operation result of buffer is OK, display. if (lOperationResult.IsOK) { lThis.label3.Text = lBuffer.Timestamp.ToString(); // Display Image lThis.displayControl.Display(lBuffer); }
カメラをカラーバー表示にしておくと、こんな感じで無事成功。
バッファ内を参照してみる
実際は表示だけで無く、画像データを参照する場合が多いはずです、
lBufferのDataPointerというプロパティが有りbyte*で返すようなので、
例によってunsafeでポインタアクセスしてみます。
(以前のJAISDKネタと同じやり方ですね)
画像の先頭行ですが、 今回は8bitのカラー画像なので幅の3倍、
あらかじめ定義しておいたStringBuilder sbにデータを入れます、
RGBの順に並んでる前提で、3つ毎に改行を入れます。
取込停止で、クリップボードにsbの文字列をコピーします、
以下はunsafeの部分だけのソース。
// Operation result of buffer is OK, display. if (lOperationResult.IsOK) { // Get TimeStamp lThis.label3.Text = lBuffer.Timestamp.ToString(); // Display Image lThis.displayControl.Display(lBuffer); // Get Raw Data unsafe { lThis.sb.Clear(); byte* pArray = lBuffer.DataPointer; for (int i = 0; i < lBuffer.Image.Width * 3; i+=3) { lThis.sb.Append(pArray[i].ToString()); lThis.sb.Append("\t"); lThis.sb.Append(pArray[i + 1].ToString()); lThis.sb.Append("\t"); lThis.sb.Append(pArray[i + 2].ToString()); lThis.sb.Append("\r\n"); } } }
カラーバーの先頭列は白なので、RGBとも222で合ってそう、
と思ったのですが、後半データがズレて来ました。
そもそも並び順が先頭行からRGBの順で合っているのか?
というところから、再度調べる予定、次回へ続く。