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


ESL製法  2010-04-17 02:15:49  No: 71558

環境:WinXP VS2008

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

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


仲澤@失業者  2010-04-17 04:08:55  No: 71559

ピクセルのカラーデータを整数の配列として直接触りたいなら
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 21:31:47  No: 71560

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


subaru  2010-04-17 21:57:12  No: 71561

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

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

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


ryo  2010-04-18 01:53:58  No: 71562

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

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

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

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


ryo  2010-04-18 01:57:44  No: 71563

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


仲澤@失業者  2010-04-19 23:13:58  No: 71564

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

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


通りすがり  2011-06-21 08:43:58  No: 71565

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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加