ストリームを使用してデコーダーを作成する方法
このトピックでは、ストリームを使用してビットマップ デコーダーを作成する方法について説明します。
ストリームを使用してビットマップ デコーダーを作成するには
イメージ ファイルをストリームに読み込みます。 この例では、アプリケーション リソースのストリームが作成されます。
アプリケーション リソース定義 (.rc) ファイルで、リソースを定義します。 次の例では、 という名前
IDR_SAMPLE_IMAGE
のリソースを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); }
CreateDecoderFromStream メソッドを使用して、新しいストリーム オブジェクトから IWICBitmapDecoder を作成します。
// 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 ファイル形式では、1 つのフレームのみがサポートされます。 この例のファイルは JPEG ファイルであるため、最初のフレーム (
0
) が使用されます。 複数のフレームを持つイメージ形式については、「 イメージの各フレームにアクセスするためのイメージのフレームを取得する方法 」を参照してください。イメージ フレームを処理します。 IWICBitmapSource オブジェクトの詳細については、「ビットマップ ソースの概要」を参照してください。
参照