画像加工したHDCから、HBITMAPを生成する方法 – プログラミング – Home

画像加工したHDCから、HBITMAP...
 
通知
すべてクリア

[解決済] 画像加工したHDCから、HBITMAPを生成する方法


なおぞう
 なおぞう
(@なおぞう)
ゲスト
結合: 9年前
投稿: 143
Topic starter  

ネット検索で頑張ってみましたが行き詰ってしまいました。
知恵を貸していただけると助かります。
VC++ 2013 共通言語ランタイムサポートを使用しない。スタティックMFCを使用する 
な環境で開発をしています。

やりたいことは、C#で作成した文字列BITMAPをVC++(DLL)で受け取り、キャンパスとなる
HDCに座標を指定して載せてその結果をC#に返し、C#では受け取った情報を表示
(picturebox)する。です。
pictureboxへの表示を考えるとVC++のDLLの関数では、HDC型ではなくHBITMAP型を返せた
ら良いと考えました。(C#内でHDC→HBITMAP→BITMAP→picturebox表示も考えています)

描画系の関数に関してまだ理解ができていない為、ごちゃごちゃしたコードで申し訳あり
ませんが、無駄なコードや必要なコードがありましたら、ご指摘戴けますようお願いします。

/*
【引数】
hmap1:HBITMAP(文字列のBITMAP画像データ)
hmap:参照渡しのHBITMAP
【戻り値】:HBITMAP
※DLLです。AP側はC#です。
*/
EXPORT HBITMAP RetHbitmap(HBITMAP hmap1, HBITMAP hmap)
{
static HBITMAP hmap2;
static HDC hdcmap, hdcmap1;
static BITMAP bmap, bmap1;

hdcmap = CreateCompatibleDC(NULL);//メモリコンテキストの作成
hdcmap1 = CreateCompatibleDC(NULL);

hmap2 = (HBITMAP)LoadImage(ins, MAKEINTRESOURCE(IDB_BITMAP1), IMAGE_BITMAP, 0,
0, LR_DEFAULTCOLOR);//リソースからビットマップをロード
//インスタンスが無い場合のHBITMAPの生成方法はあるのでしょうか?

GetObject(hmap, sizeof(BITMAP), &bmap);
GetObject(hmap1, sizeof(BITMAP), &bmap1);

SelectObject(hdcmap1, hmap1);
hmap = CreateCompatibleBitmap(hdcmap1, 300, 300);

PatBlt(hdcmap, 0, 0, 300, 300, WHITENESS); // 白で塗りつぶす
BitBlt(hdcmap, 0, 0, 250, 250, hdcmap1, 0, 0, SRCCOPY);//本番ではTransparentBlt
にする

SelectObject(hdcmap, hmap);//参照渡しへのHBITMAP情報セット? 

SaveDDB(hdcmap, 300, 300, 5);//加工したHDCをBMPファイルに保存 
              //↑これは期待通りに保存できます。
//この加工が済んだhdcmapをHBITMAPにして返したいのです。

HDC hdcT = CreateCompatibleDC(hdcO);//メモリコンテキストの作成
GetObject(hdcT, sizeof(BITMAP), &bmapT);

HBITMAP hbitmapT = CreateCompatibleBitmap(hdcmap, 300, 300);
SelectObject(hdcT, hbitmapT);
SaveDDB(hdcT, 300, 300, 8);//BMPファイルに保存→真っ黒 C#での描画でも真っ黒

DeleteDC(hdcmap);
DeleteDC(hdcmap1);
DeleteDC(hdcT );
DeleteObject(hmap2 );
//DeleteObject(hbitmapT );

return hbitmapT;
}


引用未解決
トピックタグ
なおぞう
 なおぞう
(@なおぞう)
ゲスト
結合: 9年前
投稿: 143
Topic starter  

その後もいろいろネット検索をして、解決しました。

HBITMAP testhbitmap = (HBITMAP)GetCurrentObject(hdcmap, OBJ_BITMAP);
BITMAP testbitmap;
GetObject(testhbitmap, sizeof(BITMAP), &testbitmap);
return testhbitmap;


返信引用
仲澤@失業者
(@uncle_kei)
Prominent Member
結合: 5年前
投稿: 828
 

詳しく見ていませんが、

1.hdcT に対して、何も書いてないようなので、当然真っ黒なはずです。

試しに、hdcT に対して白い四角でも書いてみてはどうでしょう。
そうすると何をすべきかわかるかもしれません。

コンパチブルBmpとコンパチブルHDCは必ずペアになるので、
クラス化(BMPを選択済みのHDCクラス等)すると間違いを避けられるかも
しれません。


返信引用
YuO
 YuO
(@YuO)
ゲスト
結合: 22年前
投稿: 320
 

SelectObjectが非常に不足している気がしていますが……。
PatBltするときにhdcmapにHBITMAPをSelectObjectしていないので,
この時点でのhdcmapは1x1のモノクロピクセルがあるだけのビットマップが選択されているはず
です。
https://msdn.microsoft.com/en-us/library/dd183489(v=vs.85).aspx

描画先のHBITMAPをちゃんと選択しておいて,描画が終わったら元のHBITMAPを選択する,という
処理が必要です。

というか,内容的にはC#だけで十分処理ができそうですが……。
PatBlt => System.Drawing.Graphics.FillRectangle
BitBlt => System.Drawing.Graphics.DrawImage
保存 => System.Drawing.Image.Save


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました