我有一个传统的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)
);
答案 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,锁定位图,并复制来自帧源的像素数据。