使用Direct2D从资源中绘制带有alpha通道的32位

时间:2012-03-12 12:12:51

标签: visual-c++ mfc alphablending direct2d wic

我有一个传统的MCF应用程序,通过预先乘以图像并使用CDC::AlphaBlend方法显示一些图像(bmp 32位,包含alpha通道信息)。

我想介绍一些使用Direct2D的新图形,但我不想将所有图像迁移到png或其他格式。

我设法从文件中绘制bmp图像,但是我遇到了从资源获取图像的问题,并且显示的图像也没有使用alpha通道信息。

所以有人可以帮我解决这个问题吗?

这是我创建位图的代码:

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 个答案:

答案 0 :(得分:1)

您需要从资源创建一个IStream以传递给IWICImagingFactory :: CreateDecoderFromStream。

由于资源在内存中可用(假设加载了包含它们的模块),最简单的方法是使用IWICImagingFactory :: CreateStream创建一个IWICStream对象,并使用IWICStream :: InitializeFromMemory初始化它。

要获取资源的大小和指向第一个字节的指针,请使用FindResource,LoadResource,LockResource和SizeofResource函数。

如果你的位图标题使用BI_BITFIELDS来指定带有alpha数据的格式,我相信WIC会尊重它。我对Direct2D没有任何经验,所以我不能说你是否需要做进一步的工作才能使用alpha数据。

如果你不能使用BI_BITFIELDS(或者如果它不起作用),你可以编写自己的IWICBitmapSource实现来包装框架的IWICBitmapSource。您应该能够将大多数调用直接传递给帧源,并提供自己的GetPixelFormat方法,该方法返回图像数据的实际格式。或者,您可以使用所需的格式创建IWICBitmap,锁定位图,并复制来自帧源的像素数据。