SDK截图(三):压缩位图之理论准备篇

压缩位图我们使用简单的行程长度编码的方法,详情参考《windows程序设计》15章之DIB压缩。

在BITMAPINFOHEADER结构中有两个和位图压缩有关的字段,分别是biCompression(Compression即压缩的意思)和niSizeImage。

其中biCompression可以被设置为4个常识值:BI_RGB,BI_RLE8,BI_RLE4或BI_BITFIELDS(它们在WINGDI.H中定义为0-3)。对于4位和8位的位图,当它们的biCompression被设置为BI_RLE4和BI_RLE8时,表示像素以一种行程长度编码(run-length encoding,RLE)压缩。
行程长度编码的原理:DIB图像中经常在一行中会有一连串相同的像素。行程长度编码通过记录下重复像素的值和它重复的次数来节省空间。

对于RLE8的解码
当第一字节不为0时,那么该字节数据就是行程长度编码的重复因子,它表示后面的像素数据重复了多少次。例如
0x05 0x27
将被解码为
0x27 0x27 0x27 0x27 0x27
当第一个字节为0时,表示后面的像素在源文件中没有重复,未进行压缩处理,所以直接输出。例如
0x45 0x32 0x77 0x34 0x59 0x99
将被解码为
0x32 0x77 0x34 0x59 0x99
另外还有一种情况是,当第二个字节是奇数,表明序列的末尾有一个不用的多余的字节。例如
0x00 0x05 0x32 0x77 0x34 0x59 0x99 0x00
将被解码为
0x32 0x77 0x34 0x59 0x99

在写解码程序时,需要维护一对从(0,0)开始的数值(y,x),每次解码出一个像素,便使x+1,每结束一行解码,将y+1,并重置x为0。
当遇到一个0x00字节,后跟一个0x02字节时,因该读入后面紧跟的两个字节,然后把他们最为无符号整数加到现在的x和y值上。在遇到一个0x00字节后面跟着一个0x00字节,这一行的解码就结束了。应该把x设置为0,并使y加1。当遇到一个0x00字节后面跟着一个0x01字节时,整个图像的解码就宣告完成。

时间: 2024-10-27 10:00:41

SDK截图(三):压缩位图之理论准备篇的相关文章

vmware之VMware Remote Console (VMRC) SDK(三)

前两节我们介绍了vmrc sdk的基本用法.在前面的demo中,有一个关键的问题是,我们现在所作的工作都是基于局域网的,作为应用层面上,主机不会直接暴露给用户,而是通过一系列的web service服务分配内网主机资源.那么我们这里可以做的是公网私网端口映射. 这里我们用一个port mapping来做映射.此处我们用内网来模拟公网的效果,可以在测试之前屏蔽内网主机IP,介绍通过windows策略机制屏蔽指定IP:http://www.cnblogs.com/yuefei/p/3805892.h

工作中的感悟 (三)三个月碎碎念篇

感慨一下来这里工作已经有一个月了,从最初的不是很适应这里的节奏,到慢慢适应了这里的生活,中间的过程就像经过一场暴风雨的洗礼虽然说的有点夸张,但是也是差不多吧,同在学校比要累很多,不过坚信不管再累.也要坚持既然有人有干,那我们就可以干我们没有什么理由坚持不了.别人可以做到的我们一样可以做到. 刚来的时候以一种无所谓.既兴奋又有很多好奇的心态来到了北京,这里很多人梦想的地方,不禁感慨以后我也在北京这里开始了这里的生活,时间长了究竟会是怎样一种心境呢,据说这里压力大.这里消费高.这里租房忒别烦人,来到

敏捷开发 之 理论概述篇

一. 敏捷实践 1. 敏捷宣言 个体与交互 胜过 过程和工具 可以工作的软件 胜过 面面俱到的文档 客户合作   胜过 合同谈判 响应变化   胜过 遵循计划 1.1 个体与交互胜过过程和工具 合作.沟通以及交互能力要比单纯的编程能力更为重要. 工具要选用合适的,不要一开始就盲目选择所谓强大的.要从小工具开始尝试,直到无法适用再去更换. 1.2 可以工作的软件胜过面面俱到的文档 面面俱到的文档需要花费大量的时间成本来编写和维护.过时的文档比没有文档更具危害性. Martin文档第一定律:直到迫切

SDK截图(四):压缩位图实例

这个问题研究了两天.<windows程序设计>中没有给出实例,MSDN也没有给出具体的例子.在知道,CSDN提问后,也没有得到答案.所以决定重新对DIB做一次彻底的研究,这大概会花去我一个月的时间,但是后面的其它的内容还要继续下去,所以暂时给这篇留白.等研究透彻了会把它补上:接下来应该会开辟一个新的分类,记录DIB学习的过程. 关于位图的压缩,MFC方法的文章比较多,下面给出一些相关链接 http://www.cnki.com.cn/Article/CJFDTotal-JYRJ20030802

LZMA C# SDK 子线程压缩与解压缩 Unity3d实例

参考雨松的LZMA SDK使用方法: http://www.xuanyusong.com/archives/3095 转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn 计划在项目中使用 不压缩的Assetbundle ,所以需要对Assetbundle 进行手动压缩打包,因为之前有对 十万个冷笑话的打包分析,所以这次坚定选择 LZMA压缩算法来压缩Assetbundle. 转自http://blog.csdn.net/huutu

UIIimage 图片的截图和压缩

实用主义,直接上代码,欢迎拿走! 1,图片的压缩 - (UIImage*)scaleFromImage:(UIImage*)image scaledToSize:(CGSize)newSize { CGSize imageSize = image.size; CGFloat width = imageSize.width; CGFloat height = imageSize.height; if (width <= newSize.width && height <= new

深入Redis(三)位图

位图 位图不是特殊的数据结构,其内容就是普通的字符串,即byte数组,可以使用get/set直接获取整个位图的内容,也可以通过getbit/setbit来将byte数组看成位数组来处理. 基本使用 Redis的位数组是自动拓展的,若偏移位置超出现有范围,则自动用0扩充. get整取,set整存,getbit零取,setbit零存,对应的则是直接操作字符串还是操作位. 统计和查找 bitcount用于统计指定位置范围内1的个数,bitpos用于查找指定范围内出现的第一个0或1的位. bitcoun

三十三、进程理论

一.进程理论 1.程序和进程 程序:一堆代码 进程:正在运行的程序 进程是一个实体,每一个进程都有它自己独立的内存空间 2.同步和异步:针对任务的提交方式 同步:提交任务之后,原地等待任务的返回结果,期间不做任何事(叫人吃饭,一直等待) 异步:提交任务之后,不等待任务的返回结果,执行运行下一行代码(叫人吃饭,但自己先走) 3.阻塞与非阻塞:针对程序运行的状态 阻塞:遇到io操作 ->>阻塞态 非阻塞:就绪或者运行态 二.创建进程的两种方式 1.方式一 from multiprocessing

HTTP协议 (三) 压缩

转自http://www.cnblogs.com/TankXiao/archive/2012/11/13/2749055.html 之前写过一个篇 [HTTP协议详解] ,这次继续介绍HTTP协议中的压缩. 本文会使用Fiddler来查看HTTP request和Response, 如果不熟悉这个工具,可以先参考[Fiddler教程] HTTP压缩是指: Web服务器和浏览器之间压缩传输的”文本内容“的方法. HTTP采用通用的压缩算法,比如gzip来压缩HTML,Javascript, CSS