Compartilhar via


Como criar um decodificador usando um fluxo

Este tópico descreve como criar um decodificador de bitmap usando um fluxo.

Para criar um decodificador de bitmap usando um fluxo

  1. Carregue um arquivo de imagem em um fluxo. Neste exemplo, um fluxo é criado para um recurso de aplicativo.

    No arquivo de definição de recurso de aplicativo (.rc), defina o recurso. O exemplo a seguir define um Image recurso chamado IDR_SAMPLE_IMAGE.

    IDR_SAMPLE_IMAGE IMAGE "turtle.jpg"
    

    O recurso será adicionado aos recursos do aplicativo quando o aplicativo for criado.

  2. Carregue o recurso do aplicativo.

    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. Bloqueie o recurso e obtenha o tamanho.

    // 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. Crie um IWICImagingFactory para criar objetos WIC (Windows Imaging Component).

    // Create WIC factory
    hr = CoCreateInstance(
        CLSID_WICImagingFactory,
        NULL,
        CLSCTX_INPROC_SERVER,
        IID_PPV_ARGS(&m_pIWICFactory)
        );
    
  5. Use o método CreateStream para criar um objeto IWICStream e inicializá-lo usando o ponteiro de memória da imagem.

    // 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. Crie um IWICBitmapDecoder do novo objeto de fluxo usando o 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
    }
    
  7. Obtenha o primeiro IWICBitmapFrameDecode da imagem.

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

    O formato de arquivo JPEG dá suporte apenas a um único quadro. Como o arquivo neste exemplo é um arquivo JPEG, o primeiro quadro (0) é usado. Para formatos de imagem que têm vários quadros, consulte Como recuperar os quadros de uma imagem para acessar cada quadro da imagem.

  8. Processe o quadro de imagem. Para obter informações adicionais sobre objetos IWICBitmapSource , consulte a Visão geral de fontes de bitmap.

Consulte Também

Guia de programação

Referência

Amostras