WICConvertBitmapSource 函数 (wincodec.h)
从给定 的 IWICBitmapSource 中获取所需像素格式的 IWICBitmapSource。
语法
HRESULT WICConvertBitmapSource(
[in] REFWICPixelFormatGUID dstFormat,
[in] IWICBitmapSource *pISrc,
[out] IWICBitmapSource **ppIDst
);
参数
[in] dstFormat
要转换为的像素格式。
[in] pISrc
类型: IWICBitmapSource*
源位图。
[out] ppIDst
类型: IWICBitmapSource**
指向 null 初始化的目标位图指针的指针。
返回值
类型: HRESULT
如果此函数成功,则返回 S_OK。 否则,将返回 HRESULT 错误代码。
注解
如果 pISrc 位图已采用所需格式,则会将 pISrc 复制到目标位图指针并添加引用。 但是,如果它不是所需的格式, WICConvertBitmapSource 将实例化 dstFormat 格式转换器并使用 pISrc 对其进行初始化。
示例
以下示例将 IWICBitmapSource 转换为 GUID_WICPixelFormat128bppPRGBAFloat 像素格式。
IWICImagingFactory *pFactory = NULL;
IWICBitmapDecoder *pDecoder = NULL;
IWICBitmapFrameDecode *pBitmapFrameDecode = NULL;
IWICBitmapSource *pConverter = NULL;
UINT uiFrameCount = 0;
UINT uiWidth = 0, uiHeight = 0;
WICPixelFormatGUID pixelFormat;
// Create the image factory.
HRESULT hr = CoCreateInstance(CLSID_WICImagingFactory,
NULL,
CLSCTX_INPROC_SERVER,
IID_IWICImagingFactory,
(LPVOID*) &pFactory);
// Create a decoder from the file.
if (SUCCEEDED(hr))
{
hr = pFactory->CreateDecoderFromFilename(L"test.jpg",
NULL,
GENERIC_READ,
WICDecodeMetadataCacheOnDemand,
&pDecoder);
}
// Get the frame count.
if (SUCCEEDED(hr))
{
hr = pDecoder->GetFrameCount(&uiFrameCount);
}
if (SUCCEEDED(hr) && (uiFrameCount > 0))
{
IWICBitmapSource *pSource = NULL;
hr = pDecoder->GetFrame(0, &pBitmapFrameDecode);
if (SUCCEEDED(hr))
{
pSource = pBitmapFrameDecode;
pSource->AddRef();
hr = pSource->GetSize(&uiWidth, &uiHeight);
}
if (SUCCEEDED(hr))
{
hr = pSource->GetPixelFormat(&pixelFormat);
}
if (SUCCEEDED(hr))
{
if (!IsEqualGUID(pixelFormat, GUID_WICPixelFormat128bppPRGBAFloat))
{
hr = WICConvertBitmapSource(GUID_WICPixelFormat128bppPRGBAFloat, pSource, &pConverter);
if (SUCCEEDED(hr))
{
pSource->Release(); // the converter has a reference to the source
pSource = NULL; // so we don't need it anymore.
pSource = pConverter; // let's treat the 128bppPABGR converter as the source
}
}
if (piConverter)
{
UINT cbStride = uiWidth * sizeof(float) * 4;
UINT cbBufferSize = cbStride;
float *pixels = new float[cbBufferSize / sizeof(float)];
if (pixels)
{
WICRect rc;
rc.X = 0;
rc.Y = 0;
rc.Width = uiWidth;
rc.Height = 1;
for (UINT i = 0; SUCCEEDED(hr) && i < uiHeight; i++)
{
hr = pSource->CopyPixels(&rc,
cbStride,
cbBufferSize,
reinterpret_cast<BYTE*>(pixels));
// Do something with the scanline here...
rc.Y++;
}
delete[] pixels;
}
else
{
hr = E_OUTOFMEMORY;
}
pConverter->Release();
}
}
}
if (pBitmapFrameDecode)
{
pBitmapFrameDecode->Release();
}
if (pDecoder)
{
pDecoder->Release();
}
if (pFactory)
{
pFactory->Release();
}
return hr;
要求
要求 | 值 |
---|---|
最低受支持的客户端 | Windows XP SP2,Windows Vista [桌面应用 |UWP 应用] |
最低受支持的服务器 | Windows Server 2008 [桌面应用 | UWP 应用] |
目标平台 | Windows |
标头 | wincodec.h |
Library | Windowscodecs.lib |
DLL | Windowscodecs.dll |