しがない1学生、VC++ビギナーです。
Visual Stadio 2008 VC++ ダイアログベースの環境で
勉強してます。
「連続で処理したデータをビットマップファイルにして
ピクチャボックスにリアルタイムで表示させたいです」
①ビットマップ読み込み
②ピクチャボックスに表示
③ビットマップを保存
の繰り返しでできるのかな?と思っています。
①と③はできたものの、②が実現できません…。
ネットで調べましたところ、
---
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]=値…、といった感じで
配列にデータが格納されています。
どなたか、ご教授願えませんでしょうか?
要はビット列データをビットマップとして描画したいということでしょうか?
であれば、DIBビットマップを用います。
以下のHPの
http://eternalwindows.jp/graphics/bitmap/bitmap00.html
[DIB]を参照してください。
Windowsで扱えるbitmap形式の画像データについて
勉強された方が良いです。
bitmapと一言で言ってもフォーマットは微妙に違いがありますし。
Windowsで言うbitmap形式の画像データは単に画素データが並んでいるだけ
ではなくてヘッダー部とか色々ありますからどれも含めて用意できて無いと
表示出来ないと思います。
また、一画素をどのように表現するかによっても格納状態が変わります。
そこまで含めて理解したうえで処理しないとうまく行かないはずです。
誤字(^^;
誤)
ではなくてヘッダー部とか色々ありますからどれも含めて用意できて無いと
正)
ではなくてヘッダー部とか色々ありますからそれも含めて用意できて無いと
ごめんなさい。
配列からじゃなくてファイルから
読み込みたいものだと勘違いしてました
配列から直接描画することもできますが、
普通はウインドウに描画できるオブジェクトに変換するんじゃないでしょうか。
一般的には、
GDIで描画(32ビット以下画像のみ)
CreateDIBSectionやCImageでDIBセクションを作成→BitBlt/StretchBltで描画
GDI+で描画(GDIよりは低速)
Bitmapオブジェクトを作成→Graphicオブジェクトに描画
WICで描画(Windows7 高速)
IWICBitmapオブジェクトを作成→Direct2Dで描画
って感じでしょうか。
あらゆる方法がありますが、
MFC、ダイアログベース上で
くぽさんのコードから察すると
①ダイアログクラスOnPaintメソッド内で、
ピクチャボックスのウィンドウ取得
②CImageクラスでファイル画像を読込
③CDCのStretchBltを使い
CImageクラスのビットマップハンドルから
メモリデバイスコンテキストへ張り付け
(CreateCompatibleDCメソッド、SelectObjectメソッド辺りを参考)
④::StretchBltのSRCCOPYにてHDCへとコピー
この手順が手っとり早いんじゃないでしょうか。
みなさん、ご指摘ありがとうございます。
勉強不足もあり、教えていただいたHPや本で学習した結果、
ダイアログの場所と表示内容を指定して描画できました。
SetDIBitsToDeviceを利用しました。
ありがとうございました。