Condividi tramite


Come creare un decodificatore usando un flusso

Questo argomento descrive come creare un decodificatore bitmap usando un flusso.

Per creare un decodificatore bitmap usando un flusso

  1. Caricare un file di immagine in un flusso. In questo esempio viene creato un flusso per una risorsa dell'applicazione.

    Nel file di definizione delle risorse dell'applicazione (.rc) definire la risorsa. Nell'esempio seguente viene definita una Image risorsa denominata IDR_SAMPLE_IMAGE.

    IDR_SAMPLE_IMAGE IMAGE "turtle.jpg"
    

    La risorsa verrà aggiunta alle risorse dell'applicazione al momento della compilazione dell'applicazione.

  2. Caricare la risorsa dall'applicazione.

    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. Bloccare la risorsa e ottenere le dimensioni.

    // 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. Creare un oggetto IWICImagingFactory per creare oggetti Windows Imaging Component (WIC).

    // Create WIC factory
    hr = CoCreateInstance(
        CLSID_WICImagingFactory,
        NULL,
        CLSCTX_INPROC_SERVER,
        IID_PPV_ARGS(&m_pIWICFactory)
        );
    
  5. Usare il metodo CreateStream per creare un oggetto IWICStream e inizializzarlo usando il puntatore alla memoria dell'immagine.

    // 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. Creare un oggetto IWICBitmapDecoder dal nuovo oggetto di flusso usando il metodo 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. Ottenere il primo IWICBitmapFrameDecode dell'immagine.

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

    Il formato di file JPEG supporta solo un singolo frame. Poiché il file in questo esempio è un file JPEG, viene usato il primo frame (0). Per i formati di immagine con più fotogrammi, vedere Come recuperare i fotogrammi di un'immagine per accedere a ogni frame dell'immagine.

  8. Elaborare la cornice dell'immagine. Per altre informazioni sugli oggetti IWICBitmapSource , vedere Panoramica delle origini bitmap.

Vedere anche

Guida per programmatori

Riferimento

Esempi