CreateCompatibleBitmap()について、質問があります。
画像(BMPやJPEG)の一覧を表示するプログラムを作成していて、
描画を高速化するため、あらかじめ表示する画像をメモリDCに
作成しておき(画像の枚数分)、そこから実際の描画DCに、
StretchBlt()で、内容を転送するという処理をしています。
メモリDCを作成する際に、題記の関数を使用しているのですが、
画像の枚数が多くなったり、画像自体が大きいときに、
CreateCompatibleBitmap()のリターンがFALSE(処理失敗)になることが
あります。(同じ画像でも起きないときもある)
メモリ不足かと思い、タスクマネージャで、残メモリを調べましたが
不足しているわけでもありません。
MSDNで調べても、失敗の詳細が載っていません。
原因や、回避策をお教えください。
ちなみに、コーディングは以下のような感じです。
MemDC.CreateCompatibleDC(pDC);
bRtn = MemBitmap.CreateCompatibleBitmap(pDC, 画像幅サイズ, 画像高さサイズ);
pMemBmp = MemDC.SelectObject(&MemBitmap);
画像幅サイズ, 画像高さサイズは、どのくらいを
指定していますか?
また、実行環境はWin9x 系でしょうか?
もしそうでしたら、画像サイズは3000Pixelぐらいが
上限だったと思います。
メモリを多く積んでいても効果がないようです。
>画像の枚数が多くなったり、画像自体が大きいときに、
JPEGで100KB くらいのデータを展開すると 数MBになったりします。
このサイズが数百個あると500MBは必要になります。
数百MBという量をメモリに全部入れるのは無謀でしょう。
今のPCのメモリは256MBぐらい搭載してますが、空き容量は半分くらい
のメモリしかありません。ほかのアプリとの兼ね合いもありますし、
空きメモリの容量は50-60MBくらいで押さえる気持ちが
ないとダメですね。これでもまだ大きいとは思いますが。
Win9xだと、たくさんメモリに読み込むとシステムリソース不足になります。
NTシリーズでも、やはり上限があるため極力、現在ビューで表示されている
ファイルだけメモリへロードした方が良いかと。NTでもシステムリソースの
上限が設定されていますので、リソース不足はメモリの使いすぎです。
あと、一覧ということは「縮小版」のイメージを作りますよね?縮小版の
サイズでメモリに納めれば、小さい容量でメモリに保存できますよね?
また、縮小版のままHDDのテンポラリーフォルダに一時格納しておくと
大きいファイルサイズのイメージやJPEG,PNGのデコードなどの処理が
省けて、一度表示したイメージは高速にロードできます。
このHDDキャッシュを各フォルダに保存すれば、高速ビューアも作れます。
Paint Shop Pro(シェアですが試用版もあります) のブラウザ機能とか
一度使ってみれば、体感しやすいかと思います。
回答ありがとうございます。
Joan さんのおっしゃるとおり、
縦×横(pixcel)×色数で、かなりのサイズになりますね。
ただ、サイズが大きくても、OS側がHDにスワップファイルを
作成して、遅いながらも動作するのでは、と思ってしまいました。
アプリケーション側で、工夫してメモリの使用量を低く抑える
ように改良してみます。