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
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 chamadoIDR_SAMPLE_IMAGE
.IDR_SAMPLE_IMAGE IMAGE "turtle.jpg"
O recurso será adicionado aos recursos do aplicativo quando o aplicativo for criado.
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); }
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); }
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) );
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); }
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 }
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.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