【问题标题】:ID2D1Bitmap to Wic with Alpha but not PNGID2D1Bitmap 到带有 Alpha 但不是 PNG 的 Wic
【发布时间】:2023-03-07 21:19:01
【问题描述】:

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

我正在使用这个功能:

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 上下文,而不是压缩格式?

【问题讨论】:

标签: c++ winapi direct2d


【解决方案1】:

native BMP codec 支持一个属性,EnableV5Header32bppBGRA 类型为VT_BOOL

指定是否允许在 GUID_WICPixelFormat32bppBGRA 像素格式。如果此选项设置为 VARIANT_TRUE,BMP 将使用 BITMAPV5HEADER 写入 标题。默认值为 VARIANT_FALSE。

注意 16 位和 32 位 Windows BMP 文件,BMP 编解码器会忽略 任何 Alpha 通道,因为许多旧图像文件在 这个额外的频道。从 Windows 8 开始,32 位 Windows BMP 文件 使用具有有效 Alpha 通道内容的 BITMAPV5HEADER 编写的是 读作 WICPixelFormat32bppBGRA

【讨论】:

    猜你喜欢
    • 2012-11-14
    • 1970-01-01
    • 1970-01-01
    • 2016-04-03
    • 1970-01-01
    • 1970-01-01
    • 2016-07-26
    • 1970-01-01
    • 2014-02-02
    相关资源
    最近更新 更多