Freigeben über


So laden Sie eine Bitmap aus einer Ressource (Windows-Imaging-Komponente)

In diesem Thema wird veranschaulicht, wie Sie einen IWICBitmapFrameDecode aus einer Anwendungsressource laden.

  1. Definieren Sie in der Anwendungsressourcendefinitionsdatei (.rc) die Ressource. Im folgenden Beispiel wird eine Image Ressource mit dem Namen IDR_SAMPLE_IMAGEdefiniert.

    IDR_SAMPLE_IMAGE IMAGE "turtle.jpg"
    

    Die Ressource wird den Ressourcen der Anwendung hinzugefügt, wenn die Anwendung erstellt wird.

  2. 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);
    }
    
    
  3. Sperren Sie die Ressource, und rufen Sie die Größe ab.

    // 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);
    }
    
    
  4. 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);
    }
    
  5. 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
    }
    
  6. Rufen Sie einen IWICBitmapFrameDecode aus dem decodierten Bild ab.

    // Retrieve the initial frame.
    if (SUCCEEDED(hr)){
       hr = pIDecoder->GetFrame(0, &pIDecoderFrame);
    }
    

    Dieser Code ruft nur den ersten (0) Frame des Bilds ab. Verwenden Sie getFrameCount für mehrformatige Bilder, um die Anzahl der Frames im Bild zu bestimmen.

Weitere Informationen

Programmierhandbuch

Referenz

Beispiele