Zeichnen einer BitmapSource mit Direct2D
In diesem Thema wird der Prozess zum Zeichnen einer IWICBitmapSource mit Direct2D veranschaulicht.
So zeichnen Sie eine Bitmapquelle mit Direct2D
Decodieren Sie ein Quellbild, und erhalten Sie eine Bitmapquelle. In diesem Beispiel wird zum Decodieren des Bilds ein IWICBitmapDecoder verwendet, und der erste Bildrahmen wird abgerufen.
// 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); }Weitere Zu zeichnende Bitmapquellentypen finden Sie in der Übersicht über Bitmapquellen.
Konvertieren Sie die Bitmapquelle in ein Pixelformat von 32bppPBGRA.
Bevor Direct2D ein Bild verwenden kann, muss es in das Pixelformat 32bppPBGRA konvertiert werden. Verwenden Sie zum Konvertieren des Bildformats die CreateFormatConverter-Methode, um ein IWICFormatConverter-Objekt zu erstellen. Verwenden Sie nach dem Erstellen die Initialize-Methode, um die Konvertierung durchzuführen.
// 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 ); }Erstellen Sie ein ID2D1RenderTarget-Objekt für das Rendern in einem Fensterhandpunkt.
// 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 );Weitere Informationen zu Renderzielen finden Sie in der Übersicht über Direct2D-Renderziele.
Erstellen Sie mithilfe der ID2D1RenderTarget::CreateBitmapFromWicBitmap-Methode ein ID2D1Bitmap-Objekt.
// 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); }Zeichnen Sie die ID2D1Bitmap mithilfe der D2D ID2D1RenderTarget::D rawBitmap-Methode.
// Draws an image and scales it to the current window size if (m_pD2DBitmap) { m_pRT->DrawBitmap(m_pD2DBitmap, rectangle); }
Code wurde in diesem Beispiel weggelassen. Den vollständigen Code finden Sie unter WIC Image Viewer Using Direct2D Sample (WIC-Bildanzeige mit direct2D-Beispiel).