我有一个传统的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,锁定位图,然后从帧源复制像素数据。