DCをビットマップ出力

[戻る]
かう 2010/02/24(水) 10:20:31
CDCにSetPixelで描画し、それをbmpとして保存したいのですが、
どのように行うのでしょうか?

HBITAMPをビットマップに保存する処理がネットにあったので、それを
使えればと思っているのですが、DCとHBITMAPの関連付けの方法がよく分かりませ
ん・・・。

CDC* pDC;
pDC = this->GetDC();

CDC m_MemDC_A;
HBITMAP
CBitmap m_bitmap_A;
m_MemDC_A.CreateCompatibleDC(pDC);

m_bitmap_A.CreateCompatibleBitmap(&m_MemDC_A, 10, 10);

かう 2010/02/24(水) 10:22:36
すいません、まだ途中だったのに間違えて投稿してしまいました。

CDCにSetPixelで描画し、それをbmpとして保存したいのですが、
どのように行うのでしょうか?

HBITAMPをビットマップに保存する処理がネットにあったので、それを
使えればと思っているのですが、DCとHBITMAPの関連付けの方法がよく分かりませ
ん・・・。(「Attach」を使うのかな?と思ったのですが・・・)

CDC* pDC;
pDC = this->GetDC();

CDC m_MemDC_A;
HBITMAP m_hBmp_A;
CBitmap m_bitmap_A;
m_MemDC_A.CreateCompatibleDC(pDC);
m_bitmap_A.CreateCompatibleBitmap(&m_MemDC_A, 10, 10);
m_bitmap_A.Attach(m_hBmp_A);//←例外が発生して落ちてしまう。

ちなみに超初心者です。
環境はWindowsXP、VS2005++、MFCです。

subaru 2010/02/24(水) 15:42:46
>環境はWindowsXP、VS2005++、MFCです。
この環境の場合、描画も保存もCImageクラスを使った方が楽です。

CImageはメモリDCを内部に持つビットマップ操作クラスで、
GetDC/ReleaseDC間にビットマップに直接絵を描くことができ、
画面への描画はBitBlt、ファイルへの保存はSaveメソッドを呼ぶだけです。
(目的がSetPixelだけならCImage::SetPixelでOK)

CImageを使わずに自分でビットマップを作る場合はCreateDibSectionを使用してください。
(CBitmapはDDBで保存には向いていません)
DCとHBITMAPの関連付けはSelectObjectを使います。

PATIO 2010/02/25(木) 13:06:53
御本人が何を目的にしているかで変わってくるかな。

今やろうとしている事をきっかけにしてHDCやHBITMAP等々
GDIの処理に関して勉強しようと考えているなら
多少面倒でもCreateDibSectionを使ってやってみる処理を
勉強すると良いと思います。
CImageクラスを使うと楽に実装できますけれど、
実際にDCとBitmapを使ってどんな手順で操作するのか
と言う部分は分からないままになりますし、
これをきっかけにbitmapの構造について勉強してみるのも
悪く無いと思います。
こういった細かい部分の知識は直接やりたい事を実現して
くれるような関数がない場合に役に立ちます。
関数がないから処理その物をあきらめてしまうというのも
あると思いますが、それではちょっと悔しいですよね。

仲澤@失業者 2010/02/25(木) 13:33:04
1.CImageを使う
2.DIBセクションをBITMAPFILEHEADERからシコシコ保管する

以外だとGDI+でもできますね。
ただ、こっちは参考にできる資料がいまいちかも。

かう 2010/03/03(水) 16:02:21
[[解決]]
みなさま、ご回答ありがとうございます。

CImageすごく便利ですね!

少し勉強してから取り組むことにいたします。

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

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