Cómo cargar un mapa de bits desde un archivo

Direct2D usa el componente de creación de imágenes de Windows (WIC) para cargar mapas de bits. Para cargar un mapa de bits desde un archivo, use primero objetos WIC para cargar la imagen y convertirla en un formato compatible con Direct2D y, a continuación, use el método CreateBitmapFromWicBitmap para crear un ID2D1Bitmap.

  1. Cree un IWICBitmapDecoder mediante el 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
            );
    
    
  2. Recupere un marco de la imagen y almacene el marco en un objeto IWICBitmapFrameDecode .

        if (SUCCEEDED(hr))
        {
            // Create the initial frame.
            hr = pDecoder->GetFrame(0, &pSource);
        }
    
  3. El mapa de bits debe convertirse en un formato que Direct2D pueda usar, por lo que convierte el formato de píxeles de la imagen a 32bppPBGRA. (Para obtener una lista de los formatos admitidos, consulte Formatos de píxeles y Modos alfa). Llame al método IWICImagingFactory::CreateFormatConverter para crear un objeto IWICFormatConverter y, a continuación, llame al método Initialize del objeto IWICFormatConverter para realizar la conversión.

        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
                );
    
  4. Llame al método CreateBitmapFromWicBitmap para crear un objeto ID2D1Bitmap que se pueda dibujar mediante un destino de representación y que se use con otros 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;
    }
    

Se ha omitido algún código de este ejemplo.

ID2D1Bitmap

CreateBitmapFromWicBitmap

Cómo cargar un mapa de bits desde un recurso