プロが教えるわが家の防犯対策術!

はじめまして。
ビットマップ操作について勉強をしております。
現在、ビットマップファイルを読み込んでメモリDC上でコピーし、新しいファイルを生成するプログラムを作っております。

手順としては
1.
LoadImageでBMPファイルを読み込み、ハンドルを取得。
hdcmem_old = CreateCompatibleDC ( NULL );
SelectObject( hdcmem_old , hBitmap_old );

2.
hdcmem_new = CreateCompatibleDC ( NULL );
hBitmap_new = CreateDIBSection( hdcmem_new , (BITMAPINFO*)&bmpInfoHeader , DIB_PAL_COLORS , (void **) &Pixel , NULL , 0 );
SelectObject( hdcmem_new, hBitmap_new );

3.
BitBlt( hdcmem_new , 0 , 0 , LCD_WIDTH , LCD_HEIGHT , hdcmem_old , 0 , 0 , SRCCOPY )

でデータを転送後、ビットマップファイルのヘッダを取り出し、&Pixelからビットデータを加えて新たなファイルを生成しているのですが、生成された画像を見ると全黒になっております。

メモリDCを完全に理解してないせいか、解決策がみあたりません。

もしよろしければ、解決策、またはヒントをご教授していただければと思います。

よろしくお願いします。

A 回答 (1件)

ベタな方法ですが、



処理のどこでコケているのか、返り値を一つずつ取得、確認するというのが確実です。

> hdcmem_old = CreateCompatibleDC ( NULL );
> SelectObject( hdcmem_old , hBitmap_old );

hdcmem_old = CreateCompatibleDC ( NULL );
if(hdcmem_old==NULL)エラー;
HGDIOBJ obj = SelectObject( hdcmem_old , hBitmap_old );
if(obj==NULL)エラー;

など。

この回答への補足

BitBltがうまくいってないみたいなので、まずはLoadImageを使用せずに地道にビットマップファイルのヘッダを読み込んでデータを取り扱うことにしました。

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

補足日時:2004/01/29 22:44
    • good
    • 0
この回答へのお礼

お返事ありがとうございます。

一つ一つの関数は返り値を調べてチェックしておりますが
特にエラーは見つかりませんでした。

ためしに一つのメモリDCに対してGDI描画関数を用いて適当な図形を
描画してみたのですが、結果は全黒のビットマップのままでした。

-----処理の流れ(完全にオフスクリーンのみの処理です)

"CreateCompatibleDC"でメモリDCを作り
"CreateDIBSection"でBitmapハンドルを得て
"SelectObject"でメモリDCとBitmapハンドルを関連付け
"polygon"等のGDI関数を用いて描画
→ 結果は全黒のビットマップ

・原因としては、メモリDCの確保の仕方がまずい
・現在1bitモノクロBITMAPを用いているため
 CreateDIBSectionの第三引数が誤っている。
等考えられるのですが、以前はこのような書式で
描画することができました。

もし、何かご意見いただければ幸いです。
よろしくお願いします。

お礼日時:2004/01/29 18:36

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!