如何使用資料流程建立解碼器
本主題描述如何使用資料流程建立點陣圖解碼器。
使用資料流程建立點陣圖解碼器
將影像檔載入資料流程。 在此範例中,會為應用程式資源建立資料流程。
在應用程式資源定義 (.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); }
使用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 檔案格式僅支援單一框架。 因為此範例中的檔案是 JPEG 檔案,所以會使用第一個框架 (
0
) 。 如需具有多個畫面的影像格式,請參閱如何擷取 影像的畫面格 ,以存取影像的每個畫面格。處理影像框架。 如需 IWICBitmapSource 物件的其他資訊,請參閱 點陣圖來源概觀。
另請參閱