Como carregar um bitmap de um arquivo
Direct2D usa o WIC (Componente de Imagem do Windows) para carregar bitmaps. Para carregar um bitmap de um arquivo, primeiro use objetos WIC para carregar a imagem e convertê-la em um formato compatível com Direct2D e, em seguida, use o método CreateBitmapFromWicBitmap para criar um ID2D1Bitmap.
Crie um IWICBitmapDecoder usando o método IWICImagingFactory::CreateDecoderFromFileName .
HRESULT DemoApp::LoadBitmapFromFile( ID2D1RenderTarget *pRenderTarget, IWICImagingFactory *pIWICFactory, PCWSTR uri, UINT destinationWidth, UINT destinationHeight, ID2D1Bitmap **ppBitmap ) { IWICBitmapDecoder *pDecoder = NULL; IWICBitmapFrameDecode *pSource = NULL; IWICStream *pStream = NULL; IWICFormatConverter *pConverter = NULL; IWICBitmapScaler *pScaler = NULL; HRESULT hr = pIWICFactory->CreateDecoderFromFilename( uri, NULL, GENERIC_READ, WICDecodeMetadataCacheOnLoad, &pDecoder );
Recupere um quadro da imagem e armazene o quadro em um objeto IWICBitmapFrameDecode .
if (SUCCEEDED(hr)) { // Create the initial frame. hr = pDecoder->GetFrame(0, &pSource); }
O bitmap deve ser convertido em um formato que Direct2D pode usar, portanto, converta o formato de pixel da imagem em 32bppPBGRA. (Para obter uma lista de formatos com suporte, consulte Formatos de pixel e modos alfa.). Chame o método IWICImagingFactory::CreateFormatConverter para criar um objeto IWICFormatConverter e chame o método Initialize do objeto IWICFormatConverter para executar a conversão.
if (SUCCEEDED(hr)) { // Convert the image format to 32bppPBGRA // (DXGI_FORMAT_B8G8R8A8_UNORM + D2D1_ALPHA_MODE_PREMULTIPLIED). hr = pIWICFactory->CreateFormatConverter(&pConverter); } if (SUCCEEDED(hr)) { hr = pConverter->Initialize( pSource, GUID_WICPixelFormat32bppPBGRA, WICBitmapDitherTypeNone, NULL, 0.f, WICBitmapPaletteTypeMedianCut );
Chame o método CreateBitmapFromWicBitmap para criar um objeto ID2D1Bitmap que pode ser desenhado por um destino de renderização e usado com outros objetos Direct2D.
if (SUCCEEDED(hr)) { // Create a Direct2D bitmap from the WIC bitmap. hr = pRenderTarget->CreateBitmapFromWicBitmap( pConverter, NULL, ppBitmap ); } SafeRelease(&pDecoder); SafeRelease(&pSource); SafeRelease(&pStream); SafeRelease(&pConverter); SafeRelease(&pScaler); return hr; }
Alguns códigos foram omitidos deste exemplo.
Tópicos relacionados