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



我有一个传统的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)
    );

您需要从资源中生成一个IStream,以传递给IWICImagingFactory:CreateDecoderFromStream。

由于内存中有可用的资源(假设加载了包含这些资源的模块),因此最简单的方法是使用IWICImagingFactory::CreateStream创建IWICStream对象,并使用IWICStream::InitializeFromMemory对其进行初始化。

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

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

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

最新更新