トップ回答者
HBITMAPからBITMAP構造体を得る方法

質問
-
いつも大変お世話になっています。
Win7 32bit、Visual Studio 2008 C++で、開発しています。
HBITMAPの情報をBITMAP構造体にセットする方法を質問させてください。
ネットで調べたところ、このサイトを見つけました。
>http://d.hatena.ne.jp/yu-hr/20090428/1240923806
---------------------------------------
// hBmp という HBITMAP型の変数があるとします
BITMAP bmp; if(!GetObject( hBmp, sizeof(BITMAP), &bmp)) { // 失敗return0; } // 成功
---------------------------------------
上記のように試してみたのですが、
<bmp>の内容のうち、<bmp.bmBits>が、0x00000000になっています。
(その他の情報は正しくセットされています。)
hBmpの確認のため、同時に下記を実行したところ、正しく保存されていました。
---------------------------------------
CImage image;
image.Attach(hBmp);
image.Save(FileName);
image.Detach();
---------------------------------------
解決策をご教授いただけますでしょうか。よろしくお願いいたします。
追伸:
ちなみに、最終的に行いたいことは、
HBITMAPからOpenCVのIplImageへの変換です。
下記の部分でエラーとなっています。
>memcpy(img->imageData,(char*)(bmp.bmBits),bmp.bmHeight*bmp.bmWidth*nChannels);
回答
-
GetObject関数の解説にありますが、CreateDIBSection関数以外で作成されたHBITMAPについてはbmBitsを返しません。解説にあるように、GetDIBits関数を使用する必要があります。
- 回答としてマーク kizakura_ui 2013年9月25日 2:41
-
http://msdn.microsoft.com/ja-jp/library/cc410355.aspx
上記に詳しく書かれています。
”他の関数を使って作成したビットマップのハンドルを hgdiobj パラメータで指定した場合、GetObject 関数はビットマップの幅、高さ、カラー形式の情報だけを返します。ビットマップ画像のビット列を取得するには、GetDIBits 関数や GetBitmapBits 関数を使ってください。”ちなみにGetDIBits
http://msdn.microsoft.com/ja-jp/library/cc428673.aspxGetBitmapBits
http://msdn.microsoft.com/ja-jp/library/cc428649.aspx- 回答としてマーク kizakura_ui 2013年9月25日 2:41
すべての返信
-
GetObject関数の解説にありますが、CreateDIBSection関数以外で作成されたHBITMAPについてはbmBitsを返しません。解説にあるように、GetDIBits関数を使用する必要があります。
- 回答としてマーク kizakura_ui 2013年9月25日 2:41
-
http://msdn.microsoft.com/ja-jp/library/cc410355.aspx
上記に詳しく書かれています。
”他の関数を使って作成したビットマップのハンドルを hgdiobj パラメータで指定した場合、GetObject 関数はビットマップの幅、高さ、カラー形式の情報だけを返します。ビットマップ画像のビット列を取得するには、GetDIBits 関数や GetBitmapBits 関数を使ってください。”ちなみにGetDIBits
http://msdn.microsoft.com/ja-jp/library/cc428673.aspxGetBitmapBits
http://msdn.microsoft.com/ja-jp/library/cc428649.aspx- 回答としてマーク kizakura_ui 2013年9月25日 2:41