BitmapクラスからDIBに変換するには?


ESL製法  2010-04-16 17:15:49  No: 71558  IP: [192.*.*.*]

環境:WinXP VS2008

画像処理をするプログラムを作成しています。
jpegやpngなどのファイルを読み込むためにGDI+のBitmapクラスを使おうと思ったのですが、GetPixelなどの関数は速度が非常に遅く、実用的でないので、DIBに変換してから処理をしようと思ったのですが、その方法がわかりません。
どなたか、教えていただけないでしょうか。
ピクセルに対し高速にアクセスできればDIBやBitmapクラスでなくてもいいです。

あと、GDI+の資料が豊富な日本語のページ、どなたかご存知でしょうか?

編集 削除
仲澤@失業者  2010-04-16 19:08:55  No: 71559  IP: [192.*.*.*]

ピクセルのカラーデータを整数の配列として直接触りたいなら
DIBセクションにしたほうが良いかもしれません。
DIBであれDIBセクションであれ、手順は似たようなものです。
1.「受け側HDC」をCreateCompatibleDC()で作成
2.「受け側DIB」を作成
3.「受け側HDC」に「受け側DIB」を選択
4.「元DC」をCreateCompatibleDC()で作成
5.「元DC」に「元BMP」を選択
6.「受け側HDC」に「元DC」をBitBlt()

で、「受け側DIB」のピクセルデータをいぢります。
表示して確認するには
PaintDC(又はBeginPainnt()戻りHDC)に「受け側HDC」をBitBltします。

編集 削除
ESL製法  2010-04-17 12:31:47  No: 71560  IP: [192.*.*.*]

えっと…
Bitmap.GetHbitmap関数を使って取得したBitmapを、新たに作成したDIBSectionにコピーして、DIBSectionから直接いじればいい、ということでしょうか?

編集 削除
subaru  2010-04-17 12:57:12  No: 71561  IP: [192.*.*.*]

Bitmap::LockBits/UnlockBits でピクセルに直接アクセスできます。

>あと、GDI+の資料が豊富な日本語のページ、どなたかご存知でしょうか?

GDI+がベースになっている.NET Frameworkのクラス群(System.Drawing.Bitmapとか)のヘルプもある程度は参考になるかと思います。

編集 削除
ryo  2010-04-17 16:53:58  No: 71562  IP: [192.*.*.*]

MFCかATLつかっていいなら、CImageが一番楽。

CImage::GetPixelAddress(0,0)
で、ビットマップのビットデータの先頭アドレスが手に入る。

あと、jpgやpngを読み込みするためだけに直接アクセスしたいというなら
CImageにはjpgやpngの入出力ができようになっているので、
ビットデータを直接いじる必要すらなくなる。

便利すぎるゆえ、あまり勉強にならないこと。
それゆえBITMAPの基本を知らない人が、
ビットデータをいじることになりやすく、
なんだかわからなくなる可能性はある(上下反転と横幅あたり)。
あと、jpg保存の圧縮比率はいじれないことも欠点か

編集 削除
ryo  2010-04-17 16:57:44  No: 71563  IP: [192.*.*.*]

>CImage::GetPixelAddress(0,0)
>で、ビットマップのビットデータの先頭アドレスが手に入る。
失礼。
(0,0)指定だと、「表示したときの左上」のアドレスが手に入るだけで
先頭アドレスとは限らないですね。

編集 削除
仲澤@失業者  2010-04-19 14:13:58  No: 71564  IP: [192.*.*.*]

>Bitmap.GetHbitmap関数を使って取得したBitmapを、新たに作成した>DIBSectionにコピーして、DIBSectionから直接いじればいい、ということで>しょうか?

その通りですが、GDI+のBitmapDataをまんま使うなら
subaruさんの発言のとおりBitmapData::Scan0を
アクセスしたほうが簡単そうですね。
失礼しましたm(__)m。

編集 削除
通りすがり  2011-06-20 23:43:58  No: 71565  IP: [192.*.*.*]

ロックしてピクセルデータを直接いじればいいかと。

編集 削除