Como carregar um bitmap de um recurso (componente de imagem do Windows)
Este tópico demonstra como carregar um IWICBitmapFrameDecode de um recurso de aplicativo.
No arquivo de definição de recurso do aplicativo (.rc), defina o recurso. O exemplo a seguir define um
Image
recurso chamadoIDR_SAMPLE_IMAGE
.IDR_SAMPLE_IMAGE IMAGE "turtle.jpg"
O recurso será adicionado aos recursos do aplicativo quando o aplicativo for criado.
Carregue o recurso do aplicativo.
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); }
Bloqueie o recurso e obtenha o tamanho.
// 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); }
Use o método CreateStream para criar um objeto IWICStream e inicializá-lo usando o ponteiro de memória da imagem.
// 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); }
Crie um IWICBitmapDecoder do novo objeto de fluxo usando o método CreateDecoderFromStream .
// 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 }
Recupere um IWICBitmapFrameDecode da imagem decodificada.
// Retrieve the initial frame. if (SUCCEEDED(hr)){ hr = pIDecoder->GetFrame(0, &pIDecoderFrame); }
Esse código recupera apenas o primeiro quadro (
0
) da imagem. Para imagens com vários quadros, use GetFrameCount para determinar o número de quadros na imagem.
Consulte Também