如何从文件加载位图

Direct2D 使用 Windows 图像处理组件 (WIC) 来加载位图。 若要从文件加载位图,请先使用 WIC 对象加载图像并将其转换为 Direct2D 兼容格式,然后使用 CreateBitmapFromWicBitmap 方法创建 ID2D1Bitmap

  1. 使用 IWICImagingFactory::CreateDecoderFromFileName 方法创建 IWICBitmapDecoder

    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. 从图像中检索帧,并将该帧存储在 IWICBitmapFrameDecode 对象中。

        if (SUCCEEDED(hr))
        {
            // Create the initial frame.
            hr = pDecoder->GetFrame(0, &pSource);
        }
    
  3. 位图必须转换为 Direct2D 可以使用的格式,因此请将图像的像素格式转换为 32bppPBGRA。 (有关支持格式的列表,请参阅 像素格式和 Alpha 模式。) 。 调用 IWICImagingFactory::CreateFormatConverter 方法来创建 IWICFormatConverter 对象,然后调用 IWICFormatConverter 对象的 Initialize 方法来执行转换。

        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. 调用 CreateBitmapFromWicBitmap 方法以创建可由呈现器目标绘制并与其他 Direct2D 对象一起使用的 ID2D1Bitmap 对象。

        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;
    }
    

此示例中省略了一些代码。

ID2D1Bitmap

CreateBitmapFromWicBitmap

如何从资源加载位图