Compartir a través de


Cómo cargar un mapa de bits desde un recurso (componente de creación de imágenes de Windows)

En este tema se muestra cómo cargar un IWICBitmapFrameDecode desde un recurso de aplicación.

  1. En el archivo de definición de recursos de aplicación (.rc), defina el recurso. En el ejemplo siguiente se define un Image recurso denominado IDR_SAMPLE_IMAGE.

    IDR_SAMPLE_IMAGE IMAGE "turtle.jpg"
    

    El recurso se agregará a los recursos de la aplicación cuando se compila la aplicación.

  2. Cargue el recurso desde la aplicación.

    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. Bloquee el recurso y obtenga el tamaño.

    // 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. Use el método CreateStream para crear un objeto IWICStream e inicializarlo mediante el puntero de memoria de la imagen.

    // 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. Cree un IWICBitmapDecoder a partir del nuevo objeto de secuencia mediante el 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
    }
    
  6. Recupere un IWICBitmapFrameDecode de la imagen descodificada.

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

    Este código solo recupera el primer marco (0) de la imagen. En el caso de las imágenes con varios fotogramas, use GetFrameCount para determinar el número de fotogramas de la imagen.

Consulte también

Guía de programación

Referencia

Muestras