環境:WinXP VS2008
画像処理をするプログラムを作成しています。
jpegやpngなどのファイルを読み込むためにGDI+のBitmapクラスを使おうと思ったのですが、GetPixelなどの関数は速度が非常に遅く、実用的でないので、DIBに変換してから処理をしようと思ったのですが、その方法がわかりません。
どなたか、教えていただけないでしょうか。
ピクセルに対し高速にアクセスできればDIBやBitmapクラスでなくてもいいです。
あと、GDI+の資料が豊富な日本語のページ、どなたかご存知でしょうか?
ピクセルのカラーデータを整数の配列として直接触りたいなら
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します。
えっと…
Bitmap.GetHbitmap関数を使って取得したBitmapを、新たに作成したDIBSectionにコピーして、DIBSectionから直接いじればいい、ということでしょうか?
Bitmap::LockBits/UnlockBits でピクセルに直接アクセスできます。
>あと、GDI+の資料が豊富な日本語のページ、どなたかご存知でしょうか?
GDI+がベースになっている.NET Frameworkのクラス群(System.Drawing.Bitmapとか)のヘルプもある程度は参考になるかと思います。
MFCかATLつかっていいなら、CImageが一番楽。
CImage::GetPixelAddress(0,0)
で、ビットマップのビットデータの先頭アドレスが手に入る。
あと、jpgやpngを読み込みするためだけに直接アクセスしたいというなら
CImageにはjpgやpngの入出力ができようになっているので、
ビットデータを直接いじる必要すらなくなる。
便利すぎるゆえ、あまり勉強にならないこと。
それゆえBITMAPの基本を知らない人が、
ビットデータをいじることになりやすく、
なんだかわからなくなる可能性はある(上下反転と横幅あたり)。
あと、jpg保存の圧縮比率はいじれないことも欠点か
>CImage::GetPixelAddress(0,0)
>で、ビットマップのビットデータの先頭アドレスが手に入る。
失礼。
(0,0)指定だと、「表示したときの左上」のアドレスが手に入るだけで
先頭アドレスとは限らないですね。
>Bitmap.GetHbitmap関数を使って取得したBitmapを、新たに作成した>DIBSectionにコピーして、DIBSectionから直接いじればいい、ということで>しょうか?
その通りですが、GDI+のBitmapDataをまんま使うなら
subaruさんの発言のとおりBitmapData::Scan0を
アクセスしたほうが簡単そうですね。
失礼しましたm(__)m。
ロックしてピクセルデータを直接いじればいいかと。
ツイート | ![]() |