杂谈SharpDx中的WIC组件——我们需要WIC的图片编码功能么?
在前文 SharpDX之Direct2D教程II——加载位图文件和保存位图文件 中,发现在VB2010中不能很好的运用SharpDx中的WIC组件进行图片的编码工作。可能是我的设置问题,也可能是SharpDx对VB2010支持的不够好(用C#就没有问题) ,有网友将代码贴到VB2012中,也发现可以运行的很好。由于手头上没有VS2012,故这个功能的实验放置一段时间
不过,回过头想一想。我们需要WIC的图片编码功能么?
Direct2D(SharpDx等)的显示绘制优势
和GDI、GDI+相比,Direct2D(SharpDx等)的优势在于利用硬件(GPU)绘制,节省时间,节省CPU的占用率,提高绘制效率。
GDI、GDI+等的绘制流程如下:
1、GDI、GDI+将绘制命令传到CPU
2、CPU开始在内存中绘制图形
3、CPU将绘制完的图形传到GPU
4、GPU将图形传到显示设备(显示器等)
Direct2D(SharpDx等)的绘制模式有Hardware(基于硬件)、Software(基于软件)、Default(默认)
其中Software模式和GDI、GDI+绘制流程一样。Default模式在初始化的时候会进行硬件检测,如果硬件支持,则采用Hardware模式,如果硬件不支持,则采用Software模式
Direct2D(SharpDx等)在模式选择为Hardware时的绘制流程如下:
1、Direct2D(SharpDx等)将绘制命令传到CPU
2、CPU将绘制命令传到GPU
3、GPU在显存中绘制图形
4、GPU将绘制好的图形传到显示设备(显示器等)
上述两个流程的区别在于:
GDI、GDI+等是利用CPU绘制图形,绘制图形在内存中有备份。
Direct2D(SharpDx等)的Hardware模式是利用GPU绘制图形,内存中并没有备份。和GDI、GDI+等相比优势在于快,节省CPU占用(GPU的绘制效率远高于CPU)。但也有一些问题,就是CPU将绘制命令传到GPU后,就不管了,至于GPU绘制成什么样子,那就是GPU的事了。这也可以解释为何早期的显卡,有时会出现渲染的错误。
WIC如何将绘制的图形编码到图形文件
在Direct2D的说明帮助里提到,如果需要利用WIC将RenderTarget上的内容编码到图形文件中的话,则得把RenderTarget的模式设置为Software(不能是Hardware,以目前的电脑配置Default基本上等同于Hardware)
WIC将RenderTarget上的内容编码到图形文件的流程如下:
1、创建WicBitmap对象,再之上创建WicRenderTarget对象
2、创建D2DBitmap对象,再利用CopyFromRenderTarget方法把RenderTarget上的内容复制到D2DBitmap对象
3、利用WicRenderTarget对象的DrawBitmap方法把D2DBitmap对象绘制到WicBitmap对象上
4、创建BitmapEncoder对象,在之上创建BitmapFrameEncoder对象,并创建和BitmapEncoder相关的Stream对象
5、将WicBitmap对象写入到BitmapFrameEncoder对象
6,调用BitmapFrameEncoder对象和BitmapEncoder对象的Commit方法,将内容编码到Stream对象,可以保存到文件
在Software模式下,是利用CPU绘制图形,结果在内存中有缓存。WIC的WicRenderTarget对象的DrawBitmap方法能把缓存中的内容绘制到WicBitmap上。
而在Hardware模式下,利用的是GPU绘制图形,在内存中没有缓存。WIC的WicRenderTarget对象的DrawBitmap方法没法把内容绘制到WicBitmap上(因为缓存中没有),强行调用的话,会报错的。
我们需要WIC的图片编码功能么?
用Direct2D(SharpDx等)就是看重其硬件加速的能力,但也籍此不能使用WIC保存绘制的内容;如果要使用WIC保存绘制的内容,则Direct2D(SharpDx等)的绘制模式设置为Software,但又牺牲了硬件加速能力,其效率和GDI、GDI+等相差无几。
再加上WIC实际上是调用系统默认的编码器对图形进行编码,但同时几乎不提供的可调参数的功能。例如:我们知道在保存JPG的时候,可以设置精度(因为JPG是有损压缩,根据精度的不同,保存的文件大小也不相同),但是用WIC保存为JPG的时候,却没有参数可以设置精度(或者是我没找到);保存为GIF时,可以设置每帧之间的间隔时间,但在WIC中也没有相应的属性可以提供(也许可以通过添加MetaData的方式设置该属性)。
换个角度考虑,图形的编码远比解码复杂的多。解码图形,只要依据已经存在的数据按照一定的规则解码就行了,即使是用不同的解码器解码出来的图形应该是毫无二致。但是,编码就不同了,同样的格式、同样的参数,不同的编码器出来的文件可能就不一样了(我们用PS和Fireworks编码出来的GIF文件大小就不一样)。
因此,如果是采用默认编码器对图形编码的话,真不一定需要WIC(WIC仅仅是提供了一个调用的途径),在GDI+中完全可以利用Bitmap对象的Save方法做到。如果需要对编码进行参数设置的话,以获得不同的文件的话,这个似乎WIC又做不到。
因此,看来我们并不需要WIC的图片编码功能。再说,我们使用Direct2D(SharpDx等)是依靠其硬件加速的能力,加强图形渲染功能。
现在在研究GIF的编码,发现 Robin 写的系列文章不错。待研究后再书新文
杂谈SharpDx中的WIC组件——我们需要WIC的图片编码功能么?的更多相关文章
- Bootstrap 中的 Typeahead 组件 -- AutoComplete
Bootstrap 中的 Typeahead 组件就是通常所说的自动完成 AutoComplete,功能很强大,但是,使用上并不太方便.这里我们将介绍一下这个组件的使用. 第一,简单使用 首先,最简单 ...
- WPF中实例化Com组件,调用组件的方法时报System.Windows.Forms.AxHost+InvalidActiveXStateException的异常
WPF中实例化Com组件,调用组件的方法时报System.Windows.Forms.AxHost+InvalidActiveXStateException的异常 在wpf中封装Com组件时,调用组件 ...
- Titanium中调用ios组件时语言不是本地化的解决方法
用Titanium开发的ios应用中,当调用系统组件时,尽管手机已经设置了系统语言为中文,但那些组件的界面却仍为英文.比如调用iphone中的相册组件,其界面为: 那么怎么让它跟系统语言保持一致呢? ...
- 第30课 Qt中的文本编辑组件
1. 3种常用的文本编辑组件的比较 单行文本支持 多行文本支持 自定义格式支持 富文本支持 QLineEdit (单行文本编辑组件) Yes No No No QPlainTextEdit (多行普通 ...
- ExtJs中xtype与组件类的对应表
from:http://blog.163.com/jx_dream/blog/static/117056627201223091021410/ 核心提示:我们在使用 ExtJs 创建组件时最容易理解的 ...
- VC中调用COM组件的方法(转载)
原文参考:http://hi.baidu.com/mingyueye/item/53ebecd44da76917d80e4449 总结一下在VC中调用COM组件的方法 准备及条件: COM服务器为进程 ...
- yii中的自定义组件
yii中的自定义组件(组件就是一些自定义的公用类) 1.在项目目录中的protected/components/Xxxx.php 2.在Xxxx.php中定义一个类,类名必须与文件名相同 3.控制器中 ...
- Bootstrap中的 Typeahead 组件
Bootstrap 中的 Typeahead 组件其实就是嵌入到其中的typeahead.js插件,可以完成输入框的自动匹配功能,在通过一些人工的调整基本可以胜任所有的匹配功能和场景,下面介绍下简单的 ...
- vc中调用Com组件的方法详解
vc中调用Com组件的方法详解 转载自:网络,来源未知,如有知晓者请告知我.需求:1.创建myCom.dll,该COM只有一个组件,两个接口: IGetRes--方法Hello(), IGet ...
随机推荐
- 线段树的区间更新---A Simple Problem with Integers
POJ 3468 Description 给出了一个序列,你需要处理如下两种询问. "C a b c"表示给[a, b]区间中的值全部增加c (-10000 ≤ c ≤ 100 ...
- 自定义View_1_关于View,ViewGroup的测量和绘制流程
自定义View(1) ------ 关于View,ViewGroup的测量和绘制流程 在Android当中,自定义控件属于比较高级的知识体系,今天我们就一起研究研究关于自定义View的那点事,看看它到 ...
- [Xamarin.Android] 自定义控件
[Xamarin.Android] 自定义控件 前言 软件项目开发的过程中,免不了遇到一些无法使用内建控件就能满足的客户需求,例如:时速表.折线图...等等.这时开发人员可以透过自定义控件的方式,为项 ...
- OC静态库里NSClassFromString得到nil的解决
如果你在静态库中有从类名反射回类的代码, 如下: NSString *myClassStr = @"myClass"; Class myClazz = NSClassFromStr ...
- CSS基础选择器温故-1
1.基本选择器语法 2.浏览器兼容性:浏览器对基本选择器都是一路绿灯通行,可以放心使用. 3.通配选择器:选择所有元素,也可以选择某个元素下的所有元素 (1)选择所有元素: *{margin: 0;p ...
- JQuery EasyUI Tree
Tree 数据转换 所有节点都包含以下属性: id:节点id,这个很重要到加载远程服务器数据 which is important to load remote data text: 显示的节点文本 ...
- 移动端调试工具-Debuggap
随着移动互联网的迅速崛起,开发移动应用程序越来越多,但如果在移动端开发应用程序需要调试时,额- 仿佛又回到了IE时代,最方便也只能到处 alert 来调试.目前已经有一款产品可以做到这一点,比如pho ...
- 微信CRM六大模块的详解
微信团队一直强调企业微信的主要功能是服务而非营销工具,微信5.0将公众号区分为服务号和订阅号,10月底平台为服务号开放高级接口,包括客服接口.网页授权等,可见服务是微信公众号的核心价值和方向.前一阵很 ...
- [android] 手机卫士设置向导页面
设置向导页面,通过SharedPreferences来判断是否已经设置过了,跳转到不同的页面 自定义样式 在res/values/styles.xml中 添加节点<style name=””&g ...
- 算法积累:解决如何获取指定文件夹路径或者文件路径下所有子文件后缀为.h .m .c的文本的行数
1.先解决如何获取一个文件的代码行数 一开始对于这个问题,我的思路就回荡在:1字符串子字符串的判断 2循环直到结束的想法 3将原来是"\n"替换掉之类的想法 一个问题总会有多种解决 ...