Guide pratique pour charger une bitmap à partir d’une ressource (composant d’acquisition d’images Windows)
Cette rubrique montre comment charger un IWICBitmapFrameDecode à partir d’une ressource d’application.
Dans le fichier de définition de ressource d’application (.rc), définissez la ressource. L’exemple suivant définit une
Image
ressource nomméeIDR_SAMPLE_IMAGE
.IDR_SAMPLE_IMAGE IMAGE "turtle.jpg"
La ressource est ajoutée aux ressources de l’application lorsque l’application est générée.
Chargez la ressource à partir de l’application.
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); }
Verrouillez la ressource et obtenez la taille.
// 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); }
Utilisez la méthode CreateStream pour créer un objet IWICStream et l’initialiser à l’aide du pointeur mémoire de l’image.
// 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); }
Créez un IWICBitmapDecoder à partir du nouvel objet stream à l’aide de la méthode 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 }
Récupérez un IWICBitmapFrameDecode à partir de l’image décodée.
// Retrieve the initial frame. if (SUCCEEDED(hr)){ hr = pIDecoder->GetFrame(0, &pIDecoderFrame); }
Ce code récupère uniquement la première image (
0
) de l’image. Pour les images à plusieurs cadres, utilisez GetFrameCount pour déterminer le nombre d’images dans l’image.
Voir aussi