Cómo dibujar un elemento BitmapSource mediante Direct2D
En este tema se muestra el proceso para dibujar un IWICBitmapSource mediante Direct2D.
Para dibujar un origen de mapa de bits mediante Direct2D
Descodifique una imagen de origen y obtenga un origen de mapa de bits. En este ejemplo, se usa un IWICBitmapDecoder para descodificar la imagen y se recupera el primer marco de imagen.
// 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); }
Para obtener más tipos de orígenes de mapa de bits que se van a dibujar, vea Información general sobre orígenes de mapa de bits.
Convierta el origen del mapa de bits en un formato de píxel 32bppPBGRA.
Para que Direct2D pueda usar una imagen, debe convertirse al formato de píxel 32bppPBGRA. Para convertir el formato de imagen, use el método CreateFormatConverter para crear un objeto IWICFormatConverter . Una vez creado, use el método Initialize para realizar la conversión.
// 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 ); }
Cree un objeto ID2D1RenderTarget para representarlo en un identificador de ventana.
// 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 );
Para obtener más información sobre los destinos de representación, consulta Información general sobre destinos de representación de Direct2D.
Cree un objeto ID2D1Bitmap mediante el método ID2D1RenderTarget::CreateBitmapFromWicBitmap .
// 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); }
Dibuje id2D1Bitmap mediante el método D2D ID2D1RenderTarget::D rawBitmap .
// Draws an image and scales it to the current window size if (m_pD2DBitmap) { m_pRT->DrawBitmap(m_pD2DBitmap, rectangle); }
El código se ha omitido en este ejemplo. Para obtener el código completo, consulta el visor de imágenes de WIC con el ejemplo de Direct2D.
Consulte también