我正在保存Direct2D设备上下文的位图,我的目标是保持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上下文吗?
发布于 2020-06-10 20:48:33
本地BMP编解码器支持一个属性,即类型为VT_BOOL的EnableV5Header32bppBGRA
指定是否允许以GUID_WICPixelFormat32bppBGRA像素格式编码数据。如果此选项设置为VARIANT_TRUE,则BMP将使用BITMAPV5HEADER头写入。默认值是VARIANT_FALSE。 注对于16位和32位Windows BMP文件,BMP编解码器忽略任何alpha通道,因为许多遗留图像文件在这个额外通道中包含无效数据。从Windows 8开始,使用具有有效alpha通道内容的BITMAPV5HEADER编写的32位Windows文件被读取为WICPixelFormat32bppBGRA。
https://stackoverflow.com/questions/62305731
复制相似问题