我正在保存一个Direct2D设备上下文的位图,我的目标是保持32位(带alpha的RGB),但没有PNG,我宁愿有一个32位的位图。我的目标是保持32位(RGB与alpha),但没有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 Context截图,但不是压缩的?
该 本机BMP编解码器 支持一个属性。EnableV5Header32bppBGRA
类型 VT_BOOL
:
指定是否允许以GUID_WICPixelFormat32bppBGRA像素格式编码数据。如果此选项设置为VARIANT_TRUE,BMP将以BITMAPV5HEADER头写入。默认值是VARIANT_FALSE。
请注意,对于16位和32位Windows BMP文件,BMP编解码器会忽略任何alpha通道,因为许多传统图像文件在这个额外通道中包含无效数据。从Windows 8开始,使用BITMAPV5HEADER写入的32位Windows BMP文件,其有效的alpha通道内容将被读取为WICPixelFormat32bppBGRA。