D2D加载图片资源(2)
※先给大家认识下什么是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)相关推荐
- QML for Android 加载图片资源的几种方式
前言 前段时间用 QML 做一个简单的 android 程序,需要打开 android手机本地图片,原本是一个非常简单的功能,但是碰到一些坑着实的被坑了一把,然而在网上并没有找到相关的文档,这里做个总 ...
- CocosCreator-精灵动态加载图片资源,实例化精灵
CocosCreator-3.0-精灵动态加载图片资源,实例化精灵 var spriteFrameEnemyBigGlobal:SpriteFrame; // 精灵框架敌人大号全局变量 onLoad( ...
- 使用PreloadJS加载图片资源
一. 使用createjs里的LoadQueue函数实现异步加载图片,监听加载进度 1.实例对象LoadQueue加载队列对象 var queue = new createjs.LoadQueue(f ...
- C++:加载图片资源
新建一个空项目 在项目路径下有个创建一个res文件夹,里面存放资源图片 假如就这三张图片 下一步,在项目中添加资源文件 然后选择前面的三张图片 上一步确定后,这里弹出来一个框 让自定义资源类型,估计 ...
- Js同步加载图片资源
//用法 await img2base64("https://cdn-corner.resource.buzzbuzzenglish.com/qr-code.svg", 'anon ...
- MFC之画刷填充矩形函数、马赫带、加载图片资源
1.笔记 1.1画刷填充矩形函数 函数原型: void CDC::FillRect(LPCRECT lpRect,CBrush* pBrush); 该函数相比FillSolidRect函数的优势在于可 ...
- js - 预加载+监听图片资源加载制作进度条
这两天遇到一个新需求:一个一镜到底的h5动画.因为功能的特殊性,就要求我们提前监听页面的静态图片是否全部加载完毕.即处理预加载. 总结下来,下次这种需求需要提前注意以下几点: 一.图片而不是背景图 本 ...
- Glide源码解析-加载流程
1 引言 一直想要阅读Glide源码,但是苦于时间和功力都不够,总是断断续续的,趁着现在有一些空暇时间,来简要分析Glide的源码.Glide的实现太过复杂,不可能做到面面俱到,如果每一行都细致分析, ...
- html src加载外部静态资源,前端性能优化2:静态资源加载与优化
css和js的装载与执行-HTML 页面加载渲染的过程 一个网站在浏览器端是如何进行渲染的呢? 流程示意图.png HTML渲染过程的一些特点 顺序执行.并发加载(单个域名的并发数量是有限的,所以多个 ...
最新文章
- 关于jetbrains系列产品2018.1.5以后的使用(crack)方法
- 运行cmd直接进入指定目录下的命令
- JavaScript实现在线MD5、SHA、AES、Rabit 、RC4、TripleDES Ripemd160 加密解密工具-toolfk程序员在线工具网...
- 原理+实战掌握SQL注入方法
- 汇编语言(二十九)之数值的二进制和十进制
- 国科大prml13-概率图(CRF,HMM)
- css3-3 css3背景样式
- 如何断开mongodb数据库连接_mongodb关闭数据库实例
- java零碎要点013---java lambda 表达式中的双冒号的用法 ::
- mysql5.7.17启动失败_解决Mysql5.7.17在windows下安装启动时提示不成功问题
- ce修改器我的世界服务器,ce修改器怎么修改金钱?ce修改器无限金钱图文教程
- VMware Workstation 15 Pro 安装centos7
- 深度视场角(Depth Field of View)
- flowable 查询完成的流程_flowable中终止流程(一)
- 机器翻译质量评测算法-BLEU
- 【金猿产品展】亚信科技“数据探索分析平台”——深挖数据价值,助客户高效管理和经营生产...
- influxdb基础(三)——influxdb按时间分片存储数据(shard和shard group)
- shell DAY1
- 小学生也能教你学编程了!8岁“程序猿”编程教学走红网络
- 【Flink】Specifying keys via field positions is only valid for tuple data types.
热门文章
- 浅谈安卓逆向协议(四)- ida pro - 小红书
- 并发知识体系大全:饿了么4面(Java岗)面经分享,干货满满
- “海大学舍”Scrum Meeting(第十周会议记录)
- PrivateKey私匙获取,签名生成
- HTML5 列表、表格、常用表单、基本标签
- Photoshop——多变量+文字数据组替换+批处理详细操作
- php 获取京东商品详情,用正则表达式,抓取京东的商品列表
- 安装kubernetes_如何在Kubernetes中安装和使用Linkerd
- 新浪微博客户端开发之授权登录+获取微博列表
- 这些手机隐藏功能你知道吗?