如何从资源 (Windows 映像组件加载位图)
本主题演示如何从应用程序资源加载 IWICBitmapFrameDecode 。
在应用程序资源定义 (.rc) 文件中,定义资源。 以下示例定义名为
Image
的资源IDR_SAMPLE_IMAGE
。IDR_SAMPLE_IMAGE IMAGE "turtle.jpg"
生成应用程序时,资源将添加到应用程序的资源中。
从应用程序加载资源。
HRESULT hr = S_OK; // WIC interface pointers. IWICStream *pIWICStream = NULL; IWICBitmapDecoder *pIDecoder = NULL; IWICBitmapFrameDecode *pIDecoderFrame = NULL; // Resource management. HRSRC imageResHandle = NULL; HGLOBAL imageResDataHandle = NULL; void *pImageFile = NULL; DWORD imageFileSize = 0; // Locate the resource in the application's executable. imageResHandle = FindResource( NULL, // This component. L"SampleImage", // Resource name. L"Image"); // Resource type. hr = (imageResHandle ? S_OK : E_FAIL); // Load the resource to the HGLOBAL. if (SUCCEEDED(hr)){ imageResDataHandle = LoadResource(NULL, imageResHandle); hr = (imageResDataHandle ? S_OK : E_FAIL); }
锁定资源并获取大小。
// Lock the resource to retrieve memory pointer. if (SUCCEEDED(hr)){ pImageFile = LockResource(imageResDataHandle); hr = (pImageFile ? S_OK : E_FAIL); } // Calculate the size. if (SUCCEEDED(hr)){ imageFileSize = SizeofResource(NULL, imageResHandle); hr = (imageFileSize ? S_OK : E_FAIL); }
使用 CreateStream 方法创建 IWICStream 对象,并使用图像内存指针对其进行初始化。
// Create a WIC stream to map onto the memory. if (SUCCEEDED(hr)){ hr = m_pIWICFactory->CreateStream(&pIWICStream); } // Initialize the stream with the memory pointer and size. if (SUCCEEDED(hr)){ hr = pIWICStream->InitializeFromMemory( reinterpret_cast<BYTE*>(pImageFile), imageFileSize); }
使用 CreateDecoderFromStream 方法从新流对象创建 IWICBitmapDecoder。
// Create a decoder for the stream. if (SUCCEEDED(hr)){ hr = m_pIWICFactory->CreateDecoderFromStream( pIWICStream, // The stream to use to create the decoder NULL, // Do not prefer a particular vendor WICDecodeMetadataCacheOnLoad, // Cache metadata when needed &pIDecoder); // Pointer to the decoder }
从解码图像中检索 IWICBitmapFrameDecode 。
// Retrieve the initial frame. if (SUCCEEDED(hr)){ hr = pIDecoder->GetFrame(0, &pIDecoderFrame); }
此代码仅检索图像的第一个 (
0
) 帧。 对于多帧图像,请使用 GetFrameCount 确定图像中的帧数。
另请参阅