2009-04-26 13 views
3

私のアプリケーションのリソースからBitmap/Imageインスタンスに非bmpイメージ(私の場合はpng)をロードしようとしています。 Bitmapコンストラクタはビットマップリソースのオーバーロードしか持たないので、これは私が回ったものです。GDI +を使用してリソースからイメージをロードするにはどうすればよいですか?

私はグローバルヒープ上にメモリを割り当てて、その中にリソースデータをコピーします。次に、(CreateStreamOnHGlobalを使用して)そのグローバルメモリブロックのIStreamを作成し、そのストリームを取るImage/Bitmapコンストラクタを使用します。基本的にはこれがうまくいきますが、これが最良の方法です。 画像を作成した後にそのメモリブロックを解放すると描画されません。DrawImageを呼び出すと何も生成されません)。 2つの質問が発生します:

  1. どのようにそのメモリブロックの寿命を管理できますか?私はそれが画像の破壊に割り当て解除されるのではないかと疑う。

  2. Image/Bitmapクラスは圧縮形式のpngデータを使用し、DrawImageを呼び出すたびにそのデータを生データに変換しますか?非常に不安定です。

訴訟はありますか?

答えて

0

ビットマップをCachedBitmapに変換し、メモリを取り除きます。

+0

CachedBitmapの問題点は、Imageから継承されないため、「通常の」ビットマップとは扱いが異なることです。 私はメモリ寿命の問題を解決することができましたが、幸運にもImageには仮想ディストラクターがあるため、非常にシンプルです。しかし、私はまだこれが正しい道であるとは確信していません。 – Meat

+0

私は、ビットマップがデータのコピーを解凍した場合、多くのpplがジャンプして、非常に効率的でもない(メモリが賢明ではない)と言うと思います。 –

2

ビットマップ以外のリソースを使用している場合、私はコードをcodeprojectに基づいています。

ビットマップを作成するために、ストリームから行うたら、あなたはそれによって、ビットマップへのストリームの寿命を結ぶ、ストリーム上の参照カウントを削除するには、ストリーム上で Release()を呼び出すそのコードを見てみると
IStream* pStream = NULL; 
::CreateStreamOnHGlobal(m_hBuffer, FALSE, &pStream) 
m_pBitmap = Gdiplus::Bitmap::FromStream(pStream); 
pStream->Release(); 

次に、そのポインタを管理するメカニズムを使用できます。

関連する問題