Partager via


Comment créer un décodeur à l’aide d’un flux

Cette rubrique explique comment créer un décodeur bitmap à l’aide d’un flux.

Pour créer un décodeur bitmap à l’aide d’un flux

  1. Charger un fichier image dans un flux. Dans cet exemple, un flux est créé pour 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ée IDR_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.

  2. 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);
    }
    
    
  3. 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);
    }
    
    
  4. Créez un IWICImagingFactory pour créer des objets WIC (Windows Imaging Component).

    // Create WIC factory
    hr = CoCreateInstance(
        CLSID_WICImagingFactory,
        NULL,
        CLSCTX_INPROC_SERVER,
        IID_PPV_ARGS(&m_pIWICFactory)
        );
    
  5. 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);
    }
    
  6. 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
    }
    
  7. Obtenez le premier IWICBitmapFrameDecode de l’image.

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

    Le format de fichier JPEG ne prend en charge qu’une seule image. Étant donné que le fichier dans cet exemple est un fichier JPEG, le premier frame (0) est utilisé. Pour les formats d’image qui ont plusieurs images, consultez Comment récupérer les images d’une image pour accéder à chaque image de l’image.

  8. Traiter le cadre de l’image. Pour plus d’informations sur les objets IWICBitmapSource , consultez vue d’ensemble des sources bitmap.

Voir aussi

Guide de programmation

Référence

Exemples