1

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

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)
    );
4

1 に答える 1

1

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

リソースはメモリ内で使用可能であるため(リソースを含むモジュールがロードされていると想定)、これを行う最も簡単な方法は、IWICImagingFactory :: CreateStreamを使用してIWICStreamオブジェクトを作成し、IWICStream::InitializeFromMemoryを使用して初期化することです。

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

ビットフィールドのヘッダーがBI_BITFIELDSを使用してアルファデータを含む形式を指定している場合、WICはそれを尊重すると思います。私はDirect2Dの経験がないので、アルファデータを使用するためにさらに何かをする必要があるかどうかはわかりません。

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

于 2012-03-13T03:38:00.267 に答える