绘制图片需要用到WIC,WIC的功能包括:
- 编解码图片。也可以自定义图片解码插件。
- 读取图片元数据。
- 图像处理(最高支持每通道32位)。
- 内置支持一些流行的格式。包括:BMP v5, GIF 89a/m, ICO, JPEG, PNG 1.2, TIFF 6.0, Windows Media Photo.
WIC绘制图片是在GPU上进行的,所以效率较高
这里写一个简单的读取图片的例子,别忘了添加头文件:
#include "wincodec.h"
以及wic的Lib
windowscodecs.lib;
下面的是d2d必须的
d2d1.lib;
dxgi.lib;
dxguid.lib;
显示图片的流程如下:
- 初始化IWICImagingFactory的对象。
- 用IWICImagingFactory创建解码器。
- 打开文件,并获取一帧。
- 转码。
- 初始化。
- 创建图片。
- 绘制图片。
pRenderTarget->BeginDraw(); //clear screen pRenderTarget->Clear(D2D1::ColorF(D2D1::ColorF::White)); IWICImagingFactory* pIWICFactory = NULL; IWICBitmapDecoder* pDecoder = NULL; IWICBitmapFrameDecode* pFrame = NULL; IWICFormatConverter* pConverter = NULL; ID2D1Bitmap* pBitmap = NULL; CoCreateInstance(CLSID_WICImagingFactory, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pIWICFactory) ); //create a decoder hr = pIWICFactory->CreateDecoderFromFilename( TEXT("C:\\Users\\NET45.png"), NULL, GENERIC_READ, WICDecodeMetadataCacheOnLoad, &pDecoder ); // Create the initial frame. hr = pDecoder->GetFrame(0, &pFrame); // Format convert the frame to 32bppPBGRA hr = pIWICFactory->CreateFormatConverter(&pConverter); //Initialize Converter hr = pConverter->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 ); // create Bitmap hr = pRenderTarget->CreateBitmapFromWicBitmap( pConverter, NULL, &pBitmap ); //get bimap size D2D1_SIZE_F size = pBitmap->GetSize() ; D2D1_POINT_2F upperLeftCorner = D2D1::Point2F(0.f, 0.f) ; //draw bitmap pRenderTarget->DrawBitmap( pBitmap, D2D1::RectF( upperLeftCorner.x, upperLeftCorner.y, upperLeftCorner.x + size.width, upperLeftCorner.y + size.height) ) ; pRenderTarget->EndDraw();
关于WIC的详细介绍可以参考MSDN: