Создание декодера с помощью потока
В этом разделе описывается создание декодера точечных рисунков с помощью потока.
Создание декодера точечных рисунков с помощью потока
Загрузка файла изображения в поток. В этом примере создается поток для ресурса приложения.
В файле определения ресурса приложения (RC) определите ресурс. В следующем примере определяется ресурс с
Image
именемIDR_SAMPLE_IMAGE
.IDR_SAMPLE_IMAGE IMAGE "turtle.jpg"
Ресурс будет добавлен в ресурсы приложения при его сборке.
Загрузите ресурс из приложения.
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); }
Заблокируйте ресурс и получите размер.
// 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); }
Создайте IWICImagingFactory , чтобы создать объекты компонента обработки изображений Windows (WIC).
// Create WIC factory hr = CoCreateInstance( CLSID_WICImagingFactory, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&m_pIWICFactory) );
Используйте метод CreateStream , чтобы создать объект IWICStream и инициализировать его с помощью указателя памяти изображения.
// 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); }
Создайте IWICBitmapDecoder из нового объекта потока с помощью метода 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 }
Получите первый IWICBitmapFrameDecode изображения.
// Retrieve the first bitmap frame. if (SUCCEEDED(hr)) { hr = pIDecoder->GetFrame(0, &pIDecoderFrame); }
Формат файла JPEG поддерживает только один кадр. Так как файл в этом примере является JPEG-файлом, используется первый кадр (
0
). Сведения о форматах изображений с несколькими кадрами см. в статье Получение кадров изображения для доступа к каждому кадру изображения.Обработайте кадр изображения. Дополнительные сведения об объектах IWICBitmapSource см. в разделе Общие сведения об источниках растровых изображений.
См. также:
Руководство по программированию