2012-03-12 47 views
1

画像を事前に乗算してCDC::AlphaBlendメソッドを使用していくつかの画像(アルファチャンネル情報付きのbmp 32ビット)を表示する従来のMCFアプリケーションがあります。Direct2Dを使用してリソースからアルファチャンネルを含む32ビットを描画します

Direct2Dを使用して新しいグラフィックをいくつか紹介したいが、すべてのイメージをpngまたは他のフォーマットに移行したくない。

ファイルからbmpイメージを描画することができましたが、リソースからイメージを取得する際に問題に直面していて、表示されたイメージではアルファチャネル情報が使用されません。

だから誰も私にこれを助けることができましたか?

これは、ビットマップを作成するために私のコードです:

hr = pIWICFactory->CreateDecoderFromFilename( L"D:\\image.bmp", 
               NULL, 
               GENERIC_READ, 
               WICDecodeMetadataCacheOnDemand, 
               &pDecoder); 
if (SUCCEEDED(hr)) 
{ 
    // Create the initial frame. 
    hr = pDecoder->GetFrame(0, &pSource); 
} 

if (SUCCEEDED(hr)) 
{ 
    //create a Direct2D bitmap from the WIC bitmap. 
    hr = pRenderTarget->CreateBitmapFromWicBitmap(
     pSource, 
     NULL, 
     ppBitmap 
     ); 

} 

これは、ビットマップを描画するためのコードです:

m_pRenderTarget->DrawBitmap(
    m_pBitmap, 
    D2D1::RectF(0.0f, 0.0f, size.width, size.height) 
    ); 

答えて

1

あなたがに渡すリソースからのIStreamを作成する必要がありますIWICImagingFactory :: CreateDecoderFromStream。

リソースはメモリに格納されているので(ロードされたモジュールがロードされていると仮定して)、最も簡単な方法はIWICImagingFactory :: CreateStreamを使用してIWICStreamオブジェクトを作成し、IWICStream :: InitializeFromMemoryを使用して初期化することです。

リソースのサイズと最初のバイトへのポインタを取得するには、FindResource、LoadResource、LockResource、およびSizeofResource関数を使用します。

ビットマップのヘッダーにBI_BITFIELDSを使用してアルファデータの形式を指定すると、WICはこれを尊重すると考えています。私はDirect2Dの経験がないので、アルファデータを使用するために何か他のことをする必要があるかどうかは言えません。

BI_BITFIELDSを使用できない場合(または動作しない場合)は、フレームのIWICBitmapSourceをラップする独自のIWICBitmapSource実装を作成できます。ほとんどの呼び出しをフレームソースに直接渡すことができ、画像データの実際の形式を返す独自のGetPixelFormatメソッドを用意する必要があります。または、必要な書式でIWICBitmapを作成し、ビットマップをロックし、フレームソースからピクセルデータをコピーすることもできます。

+0

ありがとうございます。私はできるだけ早くそれを試してみます(今の調査よりも優先順位の高いもの)。とにかく、アルファチャンネルの問題は、ファイルからビットマップを開くときに "尊重"されていないので、ストリームを使用して開くときにはそれが表示されます。 –

関連する問題