Zeichnen einer BitmapSource mit Direct2D
In diesem Thema wird der Prozess zum Zeichnen einer IWICBitmapSource mithilfe von Direct2D veranschaulicht.
So zeichnen Sie eine Bitmapquelle mit Direct2D
Decodieren Sie ein Quellbild, und rufen Sie eine Bitmapquelle ab. In diesem Beispiel wird ein IWICBitmapDecoder verwendet, um das Bild zu decodieren, 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 Typen von Bitmapquellen, die gezeichnet werden sollen, finden Sie unter Übersicht über Bitmapquellen.
Konvertieren Sie die Bitmapquelle in ein 32bppPBGRA-Pixelformat.
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 der Erstellung die Initialize-Methode , um die Konvertierung auszufü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 zum Rendern in einem Fensterhandle.
// 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 mit 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 aus diesem Beispiel weggelassen. Den vollständigen Code finden Sie im Beispiel wic Image Viewer using Direct2D (WIC-Bildanzeige mithilfe von Direct2D).
Weitere Informationen