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 |
라이브러리 | Windowscodecs.lib |
DLL | Windowscodecs.dll |