ビットマップの保存などについて

[戻る]
シレン 2006/03/17(金) 21:26:39
お世話になります。
現在.net MFC2003 で開発しております。
初心者ですので下らない質問かもしれませんが、どうぞご教授ください。

ビットマップを読み込み、編集し保存する処理を作っています。
ビットマップの保存にGdiplus::Imageクラスのsaveメゾットを使っているのですが、
(当然ですが)ビットマップのサイズが大きくなるにつれてsave処理にやたら時間がかかって
しまいます。
そこで、バイナリでデータを扱い保存を行おうと思うのですが、はたして処理速度は速くなるの
でしょうか?
自分で試してみたいのですが、現在勉強中でしてそこまで辿り着けません・・・。

もう一つ別の質問になってしまうのですが、
サイズの大きいビットマップを扱う場合(300MB以上)
CImageクラスのGetDC()でデバイスコンテキストの取得に失敗してしまうのですが、
やはりサイズが大きすぎるからなのでしょうか?
サイズが大きいビットマップの編集はどのようにするのが常識なのでしょうか?

粗末な質問で申し訳ないです。
画像処理に詳しい方、よろしくお願いします。

dairygoods 2006/03/18(土) 12:34:20
例えばペイントなどで同じサイズのビットマップを保存したときと
比べてかなり遅いようなら、高速化の可能性はあると思います。

CImage については、私には分かりません。

KJ 2006/03/18(土) 20:41:43
ビットマップをバイナリで扱いたい場合は、
BITMAPINFO、BITMAPFILEHEADER構造体を調べてみてください。

しかし、300MBのビットマップとは・・・
最近の高解像度のデジカメ画像をビットマップに変換
するとそれくらいになるんですかね。

あまりにも大きい場合は、画像を複数のブロックに分割してから
メモリやDCに展開するといいかもしれません。

シレン 2006/03/19(日) 09:19:19
返信ありがとうございます。

>例えばペイントなどで同じサイズのビットマップを保存したときと
>比べてかなり遅いようなら、高速化の可能性はあると思います。

ペイントで保存した時と比べると、やはりかなり遅いです。
倍近く時間かかってしまいました。高速化したいですねぇ・・・。

>あまりにも大きい場合は、画像を複数のブロックに分割してから
>メモリやDCに展開するといいかもしれません。

分割とは、例えば大きなビットマップを縦半分と横半分に分けて編集し、
最後にバイナリでくっつけるといった感じなのでしょうか?
デバイスコンテキスト以外での編集をどうやっていいかわからないので、
どうにか取得したいなぁと思っております。

PATIO 2006/03/20(月) 15:08:09
どーも、PATIOです。

> 分割とは、例えば大きなビットマップを縦半分と横半分に分けて編集し、
> 最後にバイナリでくっつけるといった感じなのでしょうか?
> デバイスコンテキスト以外での編集をどうやっていいかわからないので、
> どうにか取得したいなぁと思っております。

KJさんが言われているのは、あまりに大きいデータをオンメモリで扱うと
メモリスワップで遅くなるからではないかと思うのですけれど。
メモリの搭載量が多くなったとは言え、300MBは結構なサイズですから。
編集するとなると加工する為のワークメモリも必要になるでしょうから
画像全部を一塊で扱ってしまうとメモリが足りなくなってメモリスワップが
発生して動作が重くなると言う事ではないでしょうか。
あと、一括で扱うように処理を書いてしまうと画像が大きくなったらなっただけ
使用メモリがどんどん増えてしまいますから、ある程度メモリの使用量を抑える
方向も検討に入れた方がいいのではと私も思います。

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