如何使用 Direct2D 繪製 BitmapSource
本主題示範如何使用 Direct2D 繪製 IWICBitmapSource 的程式。
使用 Direct2D 繪製點陣圖來源
解碼來源影像並取得點陣圖來源。 在此範例中, 會使用 IWICBitmapDecoder 來解碼影像,並擷取第一個影像框架。
// Create a decoder IWICBitmapDecoder *pDecoder = NULL; hr = m_pIWICFactory->CreateDecoderFromFilename( szFileName, // Image to be decoded NULL, // Do not prefer a particular vendor GENERIC_READ, // Desired read access to the file WICDecodeMetadataCacheOnDemand, // Cache metadata when needed &pDecoder // Pointer to the decoder ); // Retrieve the first frame of the image from the decoder IWICBitmapFrameDecode *pFrame = NULL; if (SUCCEEDED(hr)) { hr = pDecoder->GetFrame(0, &pFrame); }
如需要繪製的其他點陣圖來源類型,請參閱 點陣圖來源概觀。
將點陣圖來源轉換為 32bppPBGRA 像素格式。
Direct2D 必須先轉換成 32bppPBGRA 像素格式,才能使用影像。 若要轉換影像格式,請使用 CreateFormatConverter 方法來建立 IWICFormatConverter 物件。 建立之後,請使用 Initialize 方法來執行轉換。
// Format convert the frame to 32bppPBGRA if (SUCCEEDED(hr)) { SafeRelease(&m_pConvertedSourceBitmap); hr = m_pIWICFactory->CreateFormatConverter(&m_pConvertedSourceBitmap); } if (SUCCEEDED(hr)) { hr = m_pConvertedSourceBitmap->Initialize( pFrame, // Input bitmap to convert GUID_WICPixelFormat32bppPBGRA, // Destination pixel format WICBitmapDitherTypeNone, // Specified dither pattern NULL, // Specify a particular palette 0.f, // Alpha threshold WICBitmapPaletteTypeCustom // Palette translation type ); }
建立 ID2D1RenderTarget 物件,以便轉譯為視窗控制碼。
// Create a D2D render target properties D2D1_RENDER_TARGET_PROPERTIES renderTargetProperties = D2D1::RenderTargetProperties(); // Set the DPI to be the default system DPI to allow direct mapping // between image pixels and desktop pixels in different system DPI settings renderTargetProperties.dpiX = DEFAULT_DPI; renderTargetProperties.dpiY = DEFAULT_DPI; // Create a D2D render target D2D1_SIZE_U size = D2D1::SizeU(rc.right - rc.left, rc.bottom - rc.top); hr = m_pD2DFactory->CreateHwndRenderTarget( renderTargetProperties, D2D1::HwndRenderTargetProperties(hWnd, size), &m_pRT );
如需轉譯目標的詳細資訊,請參閱 Direct2D 轉譯目標概觀。
使用ID2D1RenderTarget::CreateBitmapFromWicBitmap方法建立ID2D1Bitmap物件。
// D2DBitmap may have been released due to device loss. // If so, re-create it from the source bitmap if (m_pConvertedSourceBitmap && !m_pD2DBitmap) { m_pRT->CreateBitmapFromWicBitmap(m_pConvertedSourceBitmap, NULL, &m_pD2DBitmap); }
使用 D2DID2D1RenderTarget::D rawBitmap 方法繪製 ID2D1Bitmap 。
// Draws an image and scales it to the current window size if (m_pD2DBitmap) { m_pRT->DrawBitmap(m_pD2DBitmap, rectangle); }
此範例已省略程式碼。 如需完整的程式碼,請參閱 使用 Direct2D 範例的 WIC 影像檢視器。
另請參閱