※先给大家认识下什么是WIC

WIC全称是Windows Image Component,是一套扩展的API,用来处理数字图像,它是基于COM组件的。该API包含非常丰富的图像处理函数。

详细可以点击百度文库再看看  http://baike.baidu.com/view/414115.htm?fr=aladdin

看过D2D的使用(1)http://blog.csdn.net/bojie5744/article/details/29825093,我想也会熟悉了一点绘图的步骤了吧?

下面就怎么实现加载图片资源来说一下(5个步骤,实现代码比较长)。为了方便,讲解代码和上一次发的“D2D的使用(1)”结合。

1.(注意:代码接着上一次的)

在原来画矩形的基础上添加一些变量,还有头文件和链接

#include <wincodec.h>
#pragma  comment(lib,"Windowscodecs.lib")//创建WIC com需要

ID2D1Bitmap* m_pD2d1Bitmap = NULL;
IWICBitmap*    m_pWicBitmap = NULL;
IWICImagingFactory* m_pWicImagingFactory = NULL;
IWICBitmapDecoder* m_pWicDecoder = NULL;
IWICBitmapFrameDecode* m_pWicFrameDecoder = NULL;

2.在创建D2D渲染器后,创建WIC com接口(其实2者没有什么先后创建的顺序,就是方便讲解)

CoCreateInstance(CLSID_WICImagingFactory,nullptr,CLSCTX_INPROC_SERVER,IID_PPV_ARGS(&m_pWicImagingFactory));

3.用WIC加载图片,然后把WIC转换为D2D兼容的图片显示。

if(m_pWicImagingFactory != NULL)
 {
  m_pWicImagingFactory->CreateDecoderFromFilename(L"C:/a.bmp",nullptr,GENERIC_READ,WICDecodeMetadataCacheOnDemand,&m_pWicDecoder);

//"C:/a.bmp"为你的图片资源地址
  m_pWicDecoder->GetFrame(0,&m_pWicFrameDecoder);
  IWICBitmapSource* pWicSource = NULL;
  m_pWicFrameDecoder->QueryInterface(IID_PPV_ARGS(&pWicSource));
  IWICFormatConverter* pCovert = NULL;
  m_pWicImagingFactory->CreateFormatConverter(&pCovert);
   pCovert->Initialize(
   pWicSource,
   GUID_WICPixelFormat32bppPBGRA,
   WICBitmapDitherTypeNone,
   NULL,
   0.f,
   WICBitmapPaletteTypeCustom
   );

m_pWicImagingFactory->CreateBitmapFromSource(pCovert,WICBitmapCacheOnDemand,&m_pWicBitmap);
  UINT pixelWidth = 0,pixelHeight = 0;
  m_pWicBitmap->GetSize(&pixelWidth,&pixelHeight);
  SAFE_RELEASE(pCovert);

}
    pRenderTarget->CreateBitmapFromWicBitmap(m_pWicBitmap,NULL,&m_pD2d1Bitmap);

4.在绘图区域中添加代码实现图片的绘制

绘图区域是:

pRenderTarget->BeginDraw() ;

//绘图区域

hr = pRenderTarget->EndDraw() ;

里面的代码以下:

D2D1_SIZE_F rtSize = pRenderTarget->GetSize();
 if(m_pD2d1Bitmap != NULL)
 {
  D2D1_SIZE_U sizeU = m_pD2d1Bitmap->GetPixelSize();

D2D1_RECT_F rectangle3 = D2D1::RectF(
   (rtSize.width - sizeU.width)*0.5f,
   (rtSize.height - sizeU.height)*0.5f,
   sizeU.width + (rtSize.width - sizeU.width)*0.5f ,
   sizeU.height + (rtSize.height - sizeU.height)*0.5f
   );

pRenderTarget->DrawBitmap(m_pD2d1Bitmap,&rectangle3,1.0f);
 }

就这样就好了。最后就是释放指针。

以下就是完整的代码和演示效果:

ID2D1Factory* pD2DFactory = NULL;
ID2D1HwndRenderTarget* pRenderTarget=NULL;//用来在窗口中进行渲染 
ID2D1SolidColorBrush* pBlackBrush=NULL;//定义画刷,用来绘制图形
ID2D1RadialGradientBrush* pRadialGradientBrush=NULL; 
#define SAFE_RELEASE(p) if(p){p->Release() ; p = NULL ;}

ID2D1Bitmap* m_pD2d1Bitmap;
IWICBitmap*    m_pWicBitmap;
IWICImagingFactory* m_pWicImagingFactory;
IWICBitmapDecoder* m_pWicDecoder;
IWICBitmapFrameDecode* m_pWicFrameDecoder;

VOID MyDraw(HWND hwnd)
{
 HRESULT hr;
 RECT rc={0,0,500,500};//渲染矩形大小
 hr = D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &pD2DFactory) ;
 if(!SUCCEEDED(hr))
 {
  MessageBox(hwnd,"创建D2D设备出错","Error",0);
 }
 hr = pD2DFactory->CreateHwndRenderTarget(
  D2D1::RenderTargetProperties(),
  D2D1::HwndRenderTargetProperties(
  hwnd,
  D2D1::SizeU(rc.right - rc.left,rc.bottom - rc.top)),
  &pRenderTarget) ;

if(!SUCCEEDED(hr))
 {
  MessageBox(hwnd,"创建渲染器失败","Error",0);
 }

hr = CoCreateInstance(CLSID_WICImagingFactory,nullptr,CLSCTX_INPROC_SERVER,IID_PPV_ARGS(&m_pWicImagingFactory));
 if(m_pWicImagingFactory != nullptr)
 {
  m_pWicImagingFactory->CreateDecoderFromFilename(L"C:/a.bmp",nullptr,GENERIC_READ,WICDecodeMetadataCacheOnDemand,&m_pWicDecoder);
  m_pWicDecoder->GetFrame(0,&m_pWicFrameDecoder);
  IWICBitmapSource* pWicSource = nullptr;
  m_pWicFrameDecoder->QueryInterface(IID_PPV_ARGS(&pWicSource));
  IWICFormatConverter* pCovert = nullptr;
  m_pWicImagingFactory->CreateFormatConverter(&pCovert);
  hr = pCovert->Initialize(
   pWicSource,
   GUID_WICPixelFormat32bppPBGRA,
   WICBitmapDitherTypeNone,
   NULL,
   0.f,
   WICBitmapPaletteTypeCustom
   );

m_pWicImagingFactory->CreateBitmapFromSource(pCovert,WICBitmapCacheOnDemand,&m_pWicBitmap);
  SAFE_RELEASE(pCovert);
  UINT pixelWidth = 0,pixelHeight = 0;
  m_pWicBitmap->GetSize(&pixelWidth,&pixelHeight);
 }
    pRenderTarget->CreateBitmapFromWicBitmap(m_pWicBitmap,NULL,&m_pD2d1Bitmap);

hr = pRenderTarget->CreateSolidColorBrush(D2D1::ColorF(D2D1::ColorF::Red),&pBlackBrush);
 if(!SUCCEEDED(hr))
 {
  MessageBox(hwnd,"创建失败","Error",0);
 }

pRenderTarget->BeginDraw() ;
 pRenderTarget->Clear(D2D1::ColorF(D2D1::ColorF::White,0));

/*****************绘制图片*************************/
 D2D1_SIZE_F rtSize = pRenderTarget->GetSize();
 if(m_pD2d1Bitmap != nullptr)
 {
  D2D1_SIZE_U sizeU = m_pD2d1Bitmap->GetPixelSize();

D2D1_RECT_F rectangle3 = D2D1::RectF(
   (rtSize.width - sizeU.width)*0.5f,
   (rtSize.height - sizeU.height)*0.5f,
   sizeU.width + (rtSize.width - sizeU.width)*0.5f ,
   sizeU.height + (rtSize.height - sizeU.height)*0.5f
   );

pRenderTarget->DrawBitmap(m_pD2d1Bitmap,&rectangle3,1.0f);
 }
 /*****************绘制图片*************************/

/*****************绘制矩形*************************/
 pRenderTarget->DrawRectangle(
  D2D1::RectF(
  rc.left + 100.0f,
  rc.top + 100.0f,
  rc.right - 100.0f,
  rc.bottom - 100.0f),
  pBlackBrush);
 /*****************绘制矩形*************************/

pRenderTarget->EndDraw() ;
 SAFE_RELEASE(m_pWicBitmap);//这个图片资源记得释放,不然会不断增加内存,不然,你可以把它创建完后,就不要再创建,到程序结束后再释放。

SAFE_RELEASE(pBlackBrush) ;
 SAFE_RELEASE(pRadialGradientBrush);
}

由于编写比较急,有很多判断没有写,还有可以有些地方需要释放指针的没有释放(有空会改回来)。读者可以自行修改下,代码的实现

是没有问题的。

直接在OnPaint()函数中添加MyDraw(m_hWnd);就好了。

D2D加载图片资源(2)相关推荐

  1. QML for Android 加载图片资源的几种方式

    前言 前段时间用 QML 做一个简单的 android 程序,需要打开 android手机本地图片,原本是一个非常简单的功能,但是碰到一些坑着实的被坑了一把,然而在网上并没有找到相关的文档,这里做个总 ...

  2. CocosCreator-精灵动态加载图片资源,实例化精灵

    CocosCreator-3.0-精灵动态加载图片资源,实例化精灵 var spriteFrameEnemyBigGlobal:SpriteFrame; // 精灵框架敌人大号全局变量 onLoad( ...

  3. 使用PreloadJS加载图片资源

    一. 使用createjs里的LoadQueue函数实现异步加载图片,监听加载进度 1.实例对象LoadQueue加载队列对象 var queue = new createjs.LoadQueue(f ...

  4. C++:加载图片资源

    新建一个空项目 在项目路径下有个创建一个res文件夹,里面存放资源图片 假如就这三张图片  下一步,在项目中添加资源文件 然后选择前面的三张图片 上一步确定后,这里弹出来一个框 让自定义资源类型,估计 ...

  5. Js同步加载图片资源

    //用法 await img2base64("https://cdn-corner.resource.buzzbuzzenglish.com/qr-code.svg", 'anon ...

  6. MFC之画刷填充矩形函数、马赫带、加载图片资源

    1.笔记 1.1画刷填充矩形函数 函数原型: void CDC::FillRect(LPCRECT lpRect,CBrush* pBrush); 该函数相比FillSolidRect函数的优势在于可 ...

  7. js - 预加载+监听图片资源加载制作进度条

    这两天遇到一个新需求:一个一镜到底的h5动画.因为功能的特殊性,就要求我们提前监听页面的静态图片是否全部加载完毕.即处理预加载. 总结下来,下次这种需求需要提前注意以下几点: 一.图片而不是背景图 本 ...

  8. Glide源码解析-加载流程

    1 引言 一直想要阅读Glide源码,但是苦于时间和功力都不够,总是断断续续的,趁着现在有一些空暇时间,来简要分析Glide的源码.Glide的实现太过复杂,不可能做到面面俱到,如果每一行都细致分析, ...

  9. html src加载外部静态资源,前端性能优化2:静态资源加载与优化

    css和js的装载与执行-HTML 页面加载渲染的过程 一个网站在浏览器端是如何进行渲染的呢? 流程示意图.png HTML渲染过程的一些特点 顺序执行.并发加载(单个域名的并发数量是有限的,所以多个 ...

最新文章

  1. 关于jetbrains系列产品2018.1.5以后的使用(crack)方法
  2. 运行cmd直接进入指定目录下的命令
  3. JavaScript实现在线MD5、SHA、AES、Rabit 、RC4、TripleDES Ripemd160 加密解密工具-toolfk程序员在线工具网...
  4. 原理+实战掌握SQL注入方法
  5. 汇编语言(二十九)之数值的二进制和十进制
  6. 国科大prml13-概率图(CRF,HMM)
  7. css3-3 css3背景样式
  8. 如何断开mongodb数据库连接_mongodb关闭数据库实例
  9. java零碎要点013---java lambda 表达式中的双冒号的用法 ::
  10. mysql5.7.17启动失败_解决Mysql5.7.17在windows下安装启动时提示不成功问题
  11. ce修改器我的世界服务器,ce修改器怎么修改金钱?ce修改器无限金钱图文教程
  12. VMware Workstation 15 Pro 安装centos7
  13. 深度视场角(Depth Field of View)
  14. flowable 查询完成的流程_flowable中终止流程(一)
  15. 机器翻译质量评测算法-BLEU
  16. 【金猿产品展】亚信科技“数据探索分析平台”——深挖数据价值,助客户高效管理和经营生产...
  17. influxdb基础(三)——influxdb按时间分片存储数据(shard和shard group)
  18. shell DAY1
  19. 小学生也能教你学编程了!8岁“程序猿”编程教学走红网络
  20. 【Flink】Specifying keys via field positions is only valid for tuple data types.

热门文章

  1. 浅谈安卓逆向协议(四)- ida pro - 小红书
  2. 并发知识体系大全:饿了么4面(Java岗)面经分享,干货满满
  3. “海大学舍”Scrum Meeting(第十周会议记录)
  4. PrivateKey私匙获取,签名生成
  5. HTML5 列表、表格、常用表单、基本标签
  6. Photoshop——多变量+文字数据组替换+批处理详细操作
  7. php 获取京东商品详情,用正则表达式,抓取京东的商品列表
  8. 安装kubernetes_如何在Kubernetes中安装和使用Linkerd
  9. 新浪微博客户端开发之授权登录+获取微博列表
  10. 这些手机隐藏功能你知道吗?