CreateCompatibleBitmapの実行失敗

[戻る]
sunyopu 2002/06/20(木) 10:40:04
CreateCompatibleBitmap()について、質問があります。

画像(BMPやJPEG)の一覧を表示するプログラムを作成していて、
描画を高速化するため、あらかじめ表示する画像をメモリDCに
作成しておき(画像の枚数分)、そこから実際の描画DCに、
StretchBlt()で、内容を転送するという処理をしています。

メモリDCを作成する際に、題記の関数を使用しているのですが、
画像の枚数が多くなったり、画像自体が大きいときに、
CreateCompatibleBitmap()のリターンがFALSE(処理失敗)になることが
あります。(同じ画像でも起きないときもある)

メモリ不足かと思い、タスクマネージャで、残メモリを調べましたが
不足しているわけでもありません。
MSDNで調べても、失敗の詳細が載っていません。

原因や、回避策をお教えください。


ちなみに、コーディングは以下のような感じです。

MemDC.CreateCompatibleDC(pDC);
bRtn = MemBitmap.CreateCompatibleBitmap(pDC, 画像幅サイズ, 画像高さサイズ);
pMemBmp = MemDC.SelectObject(&MemBitmap);

yas0302 2002/06/20(木) 11:46:00
画像幅サイズ, 画像高さサイズは、どのくらいを
指定していますか?
また、実行環境はWin9x 系でしょうか?
もしそうでしたら、画像サイズは3000Pixelぐらいが
上限だったと思います。
メモリを多く積んでいても効果がないようです。

Joan 2002/06/20(木) 12:40:27
>画像の枚数が多くなったり、画像自体が大きいときに、
JPEGで100KB くらいのデータを展開すると 数MBになったりします。
このサイズが数百個あると500MBは必要になります。
数百MBという量をメモリに全部入れるのは無謀でしょう。
今のPCのメモリは256MBぐらい搭載してますが、空き容量は半分くらい
のメモリしかありません。ほかのアプリとの兼ね合いもありますし、
空きメモリの容量は50−60MBくらいで押さえる気持ちが
ないとダメですね。これでもまだ大きいとは思いますが。

Win9xだと、たくさんメモリに読み込むとシステムリソース不足になります。
NTシリーズでも、やはり上限があるため極力、現在ビューで表示されている
ファイルだけメモリへロードした方が良いかと。NTでもシステムリソースの
上限が設定されていますので、リソース不足はメモリの使いすぎです。

あと、一覧ということは「縮小版」のイメージを作りますよね?縮小版の
サイズでメモリに納めれば、小さい容量でメモリに保存できますよね?

また、縮小版のままHDDのテンポラリーフォルダに一時格納しておくと
大きいファイルサイズのイメージやJPEG,PNGのデコードなどの処理が
省けて、一度表示したイメージは高速にロードできます。

このHDDキャッシュを各フォルダに保存すれば、高速ビューアも作れます。
Paint Shop Pro(シェアですが試用版もあります) のブラウザ機能とか
一度使ってみれば、体感しやすいかと思います。

sunyopu 2002/06/20(木) 19:42:26
[[解決]]
回答ありがとうございます。

Joan さんのおっしゃるとおり、
縦×横(pixcel)×色数で、かなりのサイズになりますね。

ただ、サイズが大きくても、OS側がHDにスワップファイルを
作成して、遅いながらも動作するのでは、と思ってしまいました。

アプリケーション側で、工夫してメモリの使用量を低く抑える
ように改良してみます。

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