Функция WICConvertBitmapSource (wincodec.h)
Получает IWICBitmapSource в требуемом формате пикселей из заданного объекта IWICBitmapSource.
Синтаксис
HRESULT WICConvertBitmapSource(
[in] REFWICPixelFormatGUID dstFormat,
[in] IWICBitmapSource *pISrc,
[out] IWICBitmapSource **ppIDst
);
Параметры
[in] dstFormat
Формат пикселей для преобразования.
[in] pISrc
Тип: IWICBitmapSource*
Исходное растровое изображение.
[out] ppIDst
Тип: IWICBitmapSource**
Указатель на инициализированный нулевым указателем растрового изображения назначения.
Возвращаемое значение
Тип: 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 с пакетом обновления 2 (SP2), Windows Vista [классические приложения | Приложения UWP] |
Минимальная версия сервера | Windows Server 2008 [классические приложения | Приложения UWP] |
Целевая платформа | Windows |
Header | wincodec.h |
Библиотека | Windowscodecs.lib |
DLL | Windowscodecs.dll |