Cómo crear un descodificador mediante una secuencia
En este tema se describe cómo crear un descodificador de mapa de bits mediante una secuencia.
Para crear un descodificador de mapa de bits mediante una secuencia
Cargue un archivo de imagen en una secuencia. En este ejemplo, se crea una secuencia para un recurso de aplicación.
En el archivo de definición de recursos de aplicación (.rc), defina el recurso. En el ejemplo siguiente se define un
Image
recurso denominadoIDR_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.
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); }
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); }
Cree un IWICImagingFactory para crear objetos de Componente de creación de imágenes de Windows (WIC).
// Create WIC factory hr = CoCreateInstance( CLSID_WICImagingFactory, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&m_pIWICFactory) );
Use el método CreateStream para crear un objeto IWICStream e inicializarlo mediante el puntero de memoria de 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); }
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 }
Obtenga el primer IWICBitmapFrameDecode de la imagen.
// Retrieve the first bitmap frame. if (SUCCEEDED(hr)) { hr = pIDecoder->GetFrame(0, &pIDecoderFrame); }
El formato de archivo JPEG solo admite un solo fotograma. Dado que el archivo de este ejemplo es un archivo JPEG, se usa el primer fotograma (
0
). Para los formatos de imagen que tienen varios marcos, consulte Cómo recuperar los fotogramas de una imagen para acceder a cada fotograma de la imagen.Procese el marco de imagen. Para obtener información adicional sobre los objetos IWICBitmapSource , vea Información general sobre orígenes de mapa de bits.
Consulte también