首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ID2D1Bitmap到Wic使用Alpha而不是PNG

ID2D1Bitmap到Wic使用Alpha而不是PNG
EN

Stack Overflow用户
提问于 2020-06-10 14:12:26
回答 1查看 243关注 0票数 0

我正在保存Direct2D设备上下文的位图,我的目标是保持32位(RGB带alpha),但没有PNG,我宁愿拥有32位位图。

我正在使用这个函数:

代码语言:javascript
复制
HRESULT SaveBitmapToStream(
    _In_ CComPtr<ID2D1Bitmap1> d2dBitmap,
    _In_ CComPtr<IWICImagingFactory2> wicFactory2,
    _In_ CComPtr<ID2D1DeviceContext> d2dContext,
    _In_ REFGUID wicFormat,
    _In_ IStream* stream
)
{
    // Create and initialize WIC Bitmap Encoder.
    CComPtr<IWICBitmapEncoder> wicBitmapEncoder;
    auto hr =
        wicFactory2->CreateEncoder(
            wicFormat,
            nullptr,    // No preferred codec vendor.
            &wicBitmapEncoder
        );

    hr =
        wicBitmapEncoder->Initialize(
            stream,
            WICBitmapEncoderNoCache
        );

// Create and initialize WIC Frame Encoder.
    CComPtr<IWICBitmapFrameEncode> wicFrameEncode;
    hr =
        wicBitmapEncoder->CreateNewFrame(
            &wicFrameEncode,
            nullptr     // No encoder options.
        );

    if (FAILED(hr))
        return hr;
    hr = 
        wicFrameEncode->Initialize(nullptr);
    if (FAILED(hr))
        return hr;

// Retrieve D2D Device.
    CComPtr<ID2D1Device> d2dDevice;
    if (!d2dContext)
        return E_FAIL;
    d2dContext->GetDevice(&d2dDevice);

    // Create IWICImageEncoder.
    CComPtr<IWICImageEncoder> imageEncoder;
    hr = 
        wicFactory2->CreateImageEncoder(
            d2dDevice,
            &imageEncoder
        );
    if (FAILED(hr))
        return hr;

    hr =        
        imageEncoder->WriteFrame(
            d2dBitmap,  wicFrameEncode,
            nullptr     // Use default WICImageParameter options.
        );
    if (FAILED(hr))
        return hr;

    hr = wicFrameEncode->Commit();

    if (FAILED(hr))
        return hr;

    hr = wicBitmapEncoder->Commit();

    if (FAILED(hr))
        return hr;
// Flush all memory buffers to the next-level storage object.
    hr =
        stream->Commit(STGC_DEFAULT);

    return hr;

}

问题是,当我通过GUID_ContainerFormatBmp时,生成的位图没有alpha。我必须放置GUID_ContainerFormatPng,但这将压缩我不想要的图像,这是为了视频渲染,我不想要任何压缩。

有办法以32位格式而不是压缩格式捕获Direct2D上下文吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-10 20:48:33

本地BMP编解码器支持一个属性,即类型为VT_BOOLEnableV5Header32bppBGRA

指定是否允许以GUID_WICPixelFormat32bppBGRA像素格式编码数据。如果此选项设置为VARIANT_TRUE,则BMP将使用BITMAPV5HEADER头写入。默认值是VARIANT_FALSE。 注对于16位和32位Windows BMP文件,BMP编解码器忽略任何alpha通道,因为许多遗留图像文件在这个额外通道中包含无效数据。从Windows 8开始,使用具有有效alpha通道内容的BITMAPV5HEADER编写的32位Windows文件被读取为WICPixelFormat32bppBGRA。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62305731

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档