ピクチャボックスへのリアルタイム表示

[戻る]
くぽ 2009/08/27(木) 23:16:16
しがない1学生、VC++ビギナーです。
Visual Stadio 2008 VC++ ダイアログベースの環境で
勉強してます。

「連続で処理したデータをビットマップファイルにして
ピクチャボックスにリアルタイムで表示させたいです」

@ビットマップ読み込み
Aピクチャボックスに表示
Bビットマップを保存
の繰り返しでできるのかな?と思っています。
@とBはできたものの、Aが実現できません…。

ネットで調べましたところ、
---
A.
dispflg = 0で初期化した後、

B.
OnPaint()で
if(dispflg){
CDC* pDC = m_pict.GetDC();                  //デバイスコンテキストを取得
CDC myDC;                                   //ビットマップ表示用デバイスコンテ
キスト
CBitmap myBMP;                              //ビットマップ処理用オブジェクト
myBMP.LoadBitmap(IDB_BITMAP_SAMPLE);        //画像読み込み
myDC.CreateCompatibleDC(pDC);               //myDCをpDCと互換性のあるものにする
CBitmap* oldBMP = myDC.SelectObject(&myBMP);//myBMPを選択
pDC->BitBlt(0,0,240,320,&myDC,0,0,SRCCOPY); //ビットマップを転送
myDC.SelectObject(oldBMP);                  //元のビットマップに戻す
}

C.
ボタンの関数で
dispflg = 1;
Invalidate();       //再描画
---
とあったので試してみました。
しかし、
自分で名付けた(char型)ビットマップを表示させる方法が
わかりません。。。

bits[(pict_h-1-y)*pict_w +x*3+0]=値…、といった感じで
配列にデータが格納されています。

どなたか、ご教授願えませんでしょうか?

bun 2009/08/28(金) 08:45:00
要はビット列データをビットマップとして描画したいということでしょうか?
であれば、DIBビットマップを用います。

以下のHPの
  http://eternalwindows.jp/graphics/bitmap/bitmap00.html
[DIB]を参照してください。

PATIO 2009/08/28(金) 13:05:21
Windowsで扱えるbitmap形式の画像データについて
勉強された方が良いです。
bitmapと一言で言ってもフォーマットは微妙に違いがありますし。
Windowsで言うbitmap形式の画像データは単に画素データが並んでいるだけ
ではなくてヘッダー部とか色々ありますからどれも含めて用意できて無いと
表示出来ないと思います。
また、一画素をどのように表現するかによっても格納状態が変わります。
そこまで含めて理解したうえで処理しないとうまく行かないはずです。

PATIO 2009/08/28(金) 13:07:52
誤字(^^;

誤)
ではなくてヘッダー部とか色々ありますからどれも含めて用意できて無いと

正)
ではなくてヘッダー部とか色々ありますからそれも含めて用意できて無いと

Pegasus 2009/08/28(金) 16:36:57
CImageを使えば簡単にできそうです

http://ayusya.hp.infoseek.co.jp/ProgramCTip.html#DrawBitmapFileEx
あたり参考になるかと。。。

Pegasus 2009/08/28(金) 16:41:04
ごめんなさい。
配列からじゃなくてファイルから
読み込みたいものだと勘違いしてました

subaru 2009/08/29(土) 02:34:02
配列から直接描画することもできますが、
普通はウインドウに描画できるオブジェクトに変換するんじゃないでしょうか。

一般的には、
GDIで描画(32ビット以下画像のみ)
CreateDIBSectionやCImageでDIBセクションを作成→BitBlt/StretchBltで描画

GDI+で描画(GDIよりは低速)
Bitmapオブジェクトを作成→Graphicオブジェクトに描画

WICで描画(Windows7 高速)
IWICBitmapオブジェクトを作成→Direct2Dで描画

って感じでしょうか。

飛んできたどらやき 2009/09/02(水) 16:18:32
あらゆる方法がありますが、
MFC、ダイアログベース上で
くぽさんのコードから察すると

@ダイアログクラスOnPaintメソッド内で、
 ピクチャボックスのウィンドウ取得

ACImageクラスでファイル画像を読込

BCDCのStretchBltを使い
 CImageクラスのビットマップハンドルから
 メモリデバイスコンテキストへ張り付け
 (CreateCompatibleDCメソッド、SelectObjectメソッド辺りを参考)

C::StretchBltのSRCCOPYにてHDCへとコピー

この手順が手っとり早いんじゃないでしょうか。

くぽ 2009/09/03(木) 00:37:38
[[解決]]
みなさん、ご指摘ありがとうございます。

勉強不足もあり、教えていただいたHPや本で学習した結果、
ダイアログの場所と表示内容を指定して描画できました。
SetDIBitsToDeviceを利用しました。

ありがとうございました。

古いスレッドには追加発言できません。