【问题标题】:Draw 32-bits with alpha channel from resources using Direct2D使用 Direct2D 从资源中绘制具有 alpha 通道的 32 位
【发布时间】:2012-03-28 20:03:26
【问题描述】:

我有一个旧版 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)
    );

【问题讨论】:

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


    【解决方案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,锁定位图,然后从帧源复制像素数据。

    【讨论】:

    • 感谢您的重播。我会尽快尝试(比现在调查更优先的事情)。无论如何,当我从文件中打开位图时,alpha 通道的问题现在没有被“尊重”......所以我怀疑它会在使用流打开时出现。
    猜你喜欢
    • 2010-09-23
    • 2011-02-06
    • 1970-01-01
    • 1970-01-01
    • 2012-05-30
    • 2014-03-12
    • 2019-06-08
    • 2013-07-11
    • 1970-01-01
    相关资源
    最近更新 更多