Erstellen eines Decoders mithilfe eines Streams
In diesem Thema wird beschrieben, wie ein Bitmapdecoder mithilfe eines Streams erstellt wird.
So erstellen Sie einen Bitmapdecoder mithilfe eines Streams
Laden Sie eine Bilddatei in einen Stream. In diesem Beispiel wird ein Stream für eine Anwendungsressource erstellt.
Definieren Sie in der Anwendungsressourcendefinitionsdatei (.rc) die Ressource. Im folgenden Beispiel wird eine Ressource
Imagemit dem NamenIDR_SAMPLE_IMAGEdefiniert.IDR_SAMPLE_IMAGE IMAGE "turtle.jpg"Die Ressource wird den Ressourcen der Anwendung hinzugefügt, wenn die Anwendung erstellt wird.
Laden Sie die Ressource aus der Anwendung.
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); }Sperren Sie die Ressource, und erhalten Sie die Größe.
// 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); }Erstellen Sie eine IWICImagingFactory, um Windows WIC-Objekte (Imaging Component) zu erstellen.
// Create WIC factory hr = CoCreateInstance( CLSID_WICImagingFactory, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&m_pIWICFactory) );Verwenden Sie die CreateStream-Methode, um ein IWICStream-Objekt zu erstellen und es mithilfe des Bildspeicherzeigers zu initialisieren.
// 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); }Erstellen Sie mithilfe der CreateDecoderFromStream-Methode einen IWICBitmapDecoder aus dem neuen Streamobjekt.
// 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 }Sie erhalten den ersten IWICBitmapFrameDecode des Bilds.
// Retrieve the first bitmap frame. if (SUCCEEDED(hr)) { hr = pIDecoder->GetFrame(0, &pIDecoderFrame); }Das JPEG-Dateiformat unterstützt nur einen einzelnen Frame. Da die Datei in diesem Beispiel eine JPEG-Datei ist, wird der erste Frame (
0) verwendet. Informationen zu Bildformaten mit mehreren Frames finden Sie unter Abrufen der Frames eines Bilds für den Zugriff auf die einzelnen Frames des Bilds.Verarbeiten Sie den Bildrahmen. Weitere Informationen zu IWICBitmapSource-Objekten finden Sie in der Übersicht über Bitmapquellen.