杂谈SharpDx中的WIC组件——我们需要WIC的图片编码功能么?

简介: 在前文 SharpDX之Direct2D教程II——加载位图文件和保存位图文件 中,发现在VB2010中不能很好的运用SharpDx中的WIC组件进行图片的编码工作。可能是我的设置问题,也可能是SharpDx对VB2010支持的不够好(用C#就没有问题) ,有网友将代码贴到VB2012中,也发现可以运行的很好。

在前文 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 写的系列文章不错。待研究后再书新文

相关实践学习
在云上部署ChatGLM2-6B大模型(GPU版)
ChatGLM2-6B是由智谱AI及清华KEG实验室于2023年6月发布的中英双语对话开源大模型。通过本实验,可以学习如何配置AIGC开发环境,如何部署ChatGLM2-6B大模型。
相关文章
|
分布式计算 并行计算 Java
浅析Python自带的线程池和进程池
浅析Python自带的线程池和进程池
1314 0
|
数据采集 存储 监控
大数据的数据来源 - 数据采集的方式(数据接入的方式)
大数据处理关键技术一般包括:大数据采集、大数据预处理、大数据存储及管理、大数据分析及挖掘、大数据展现和应用(大数据检索、大数据可视化、大数据应用、大数据安全等)。下面主要介绍下大数据采集
7602 0
|
安全 算法 网络协议
解析:HTTPS通过SSL/TLS证书加密的原理与逻辑
HTTPS通过SSL/TLS证书加密,结合对称与非对称加密及数字证书验证实现安全通信。首先,服务器发送含公钥的数字证书,客户端验证其合法性后生成随机数并用公钥加密发送给服务器,双方据此生成相同的对称密钥。后续通信使用对称加密确保高效性和安全性。同时,数字证书验证服务器身份,防止中间人攻击;哈希算法和数字签名确保数据完整性,防止篡改。整个流程保障了身份认证、数据加密和完整性保护。
|
传感器 物联网 Linux
Python:蓝牙心率广播设备监测(BLE 心率监测器)技术解析与实现
本文探讨了如何使用 Python 脚本与支持蓝牙低功耗(BLE)心率广播的设备交互以获取实时心率数据。重点分析了 BLE 协议、GATT 服务模型,以及具体方法。此外,还讨论了华为手表等设备的兼容性问题。
2747 19
|
消息中间件 NoSQL Java
2024年高频Java面试题集锦(含答案),让你的面试之路畅通无阻!
或许这份面试题还不足以囊括所有 Java 问题,但有了它,我相信你一定不会“败”的很惨,因为有了它,足以应对目前市面上绝大部分的 Java 面试了,因为这篇文章不论是从深度还是广度上来讲,都已经囊括了非常多的知识点了。
|
存储 Java 数据库
Java面向对象编程实战详解(图书管理系统示例)(上)
Java面向对象编程实战详解(图书管理系统示例)
558 0
|
算法框架/工具 C++ Python
根据相机旋转矩阵求解三个轴的旋转角/欧拉角/姿态角 或 旋转矩阵与欧拉角(Euler Angles)之间的相互转换,以及python和C++代码实现
根据相机旋转矩阵求解三个轴的旋转角/欧拉角/姿态角 或 旋转矩阵与欧拉角(Euler Angles)之间的相互转换,以及python和C++代码实现
1827 0
|
前端开发 安全 UED
React 文件预览组件:File Preview
在现代Web应用中,文件上传和预览功能至关重要。本文基于React库,详细介绍如何构建文件预览组件,涵盖文件选择器、图片预览、文件大小限制及多种文件类型支持。通过实际代码示例,解析常见问题如跨域请求、文件路径处理和状态管理,并提供解决方案。帮助开发者提升用户体验,减少误操作。
1130 2
|
前端开发 开发者 Windows
2行代码将你的本地服务暴露在公网!
【8月更文挑战第8天】【8月更文挑战第7天】
2898 1
2行代码将你的本地服务暴露在公网!