Direct 2D 加载位图.

本文介绍如何利用Direct2D结合Windows Imaging Component (WIC)来加载位图文件,并实现图像的缩放及格式转换。文章详细阐述了通过WIC接口进行图像处理的五个步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

HRESULT LoadImageFormFile(
                          ID2D1RenderTarget *pRT,
                          IWICImagingFactory *pWicFactory,
                          PCTSTR url,
                          UINT dstWidth,
                          UINT dstHeight,
                          ID2D1Bitmap **ppBitmap
                          )
{
    IWICBitmapDecoder *pDecoder = NULL;
    IWICBitmapFrameDecode *pFrame = NULL;
    IWICFormatConverter *pFormat =  NULL;
    IWICBitmapScaler *pScaler = NULL;

    HRESULT hr = pWicFactory->CreateDecoderFromFilename(
                    url, 
                    NULL, 
                    GENERIC_READ,
                    WICDecodeMetadataCacheOnLoad,
                    &pDecoder
                    );
    if ( SUCCEEDED(hr) )
    {
        hr = pDecoder->GetFrame(0, &pFrame);
    }
    if ( SUCCEEDED(hr) )
    {
        hr = pWicFactory->CreateFormatConverter(&pFormat);
    }
    if ( SUCCEEDED(hr) )
    {
        if ( dstWidth != 0 || dstHeight != 0)
        {
            UINT originalWidth, originalHeight;
            hr = pFrame->GetSize(&originalWidth, &originalHeight);
            if ( SUCCEEDED(hr) )
            {
                if ( dstWidth == 0 )
                {
                    FLOAT scalar = (FLOAT)dstHeight / (FLOAT)originalHeight;
                    dstWidth = (UINT)(scalar * (FLOAT)originalWidth);
                }
                else
                {
                    FLOAT scalar = (FLOAT)dstWidth / (FLOAT)originalWidth;
                    dstHeight = (UINT)(scalar * (FLOAT)originalHeight);
                }
                hr = pWicFactory->CreateBitmapScaler(&pScaler);
            }
            if ( SUCCEEDED(hr) )
            {
                hr = pScaler->Initialize(
                        pFrame,
                        dstWidth,
                        dstHeight,
                        WICBitmapInterpolationModeCubic
                        );
            }
            if ( SUCCEEDED(hr) )
            {
                hr = pFormat->Initialize(
                        pScaler,
                        GUID_WICPixelFormat32bppPBGRA,
                        WICBitmapDitherTypeNone,
                        NULL,
                        0.0f,
                        WICBitmapPaletteTypeMedianCut
                        );
            }
        }
        else
        {
            hr = pFormat->Initialize(
                pFrame,
                GUID_WICPixelFormat32bppPBGRA,
                WICBitmapDitherTypeNone,
                NULL,
                0.0f,
                WICBitmapPaletteTypeMedianCut
                );
        }
    }

    if ( SUCCEEDED(hr) )
    {
        hr = pRT->CreateBitmapFromWicBitmap(
            pFormat,
            ppBitmap
            );
    }

    SafeRelease(pDecoder);
    SafeRelease(pFrame);
    SafeRelease(pFormat);
    SafeRelease(pScaler);
    return hr;
}


Direct 2D本身不能加载位图, 需要通过WIC接口.

#include <wincodec.h>

#pragma comment(lib, "Windowscodecs.lib")


首先 使用 CoCreateInstance 构造一个 IWicImaginFactory 对象.

IWicImaginFactory 对象用于创建所有 WIC 对象.


步骤: 
1, 
  IWICImagingFactory::CreateDecoderFromFilename(...) 函数从 文件 加载位图.
  该函数产生一个 IWICBitmapDecoder 对象.
  该对象指向位图数据.
2,
  IWICBitmapDecoder::GetSize(...) 函数从 位图数据 中读取一帧图像的数据.
  该函数产生一个 IWICBitmapFrameDecode 对象.
  该对象指向位图某一帧图像数据.
3, 
  IWICBitmapScaler::Initialize(...) 函数将 图像缩放.
  如果不需要缩放, 此步骤可以省略.
4, 
  IWICFormatConverter::Initialize(...) 函数将 图像数据 转换格式, 使得Direct 2D能够识别.
5,
  ID2D1HwndRenderTarget::CreateBitmapFromWicBitmap(...) 
  通过传入的 图像数据 创建 ID2D1Bitmap 对象.
 
前面4步都是由WIC完成, 只有最后一步使用Direct 2D完成.

创建的位图是设备相关资源, 在设备丢失之后需要重新创建.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值