压缩位图我们使用简单的行程长度编码的方法,详情参考《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字节时,整个图像的解码就宣告完成。

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

  1. 三分钟分布式CAP理论

    分布式系统架构理论,定义了三种指标,理论说我们最多只能满足两个. ## 分布式系统 首先我们这个理论所说的分布式系统,是指系统内会共享数据,互相有连接有交互,才能完成系统功能的的分布式系统.而这个理论 ...

  2. 【原创 深度学习与TensorFlow 动手实践系列 - 3】第三课:卷积神经网络 - 基础篇

    [原创 深度学习与TensorFlow 动手实践系列 - 3]第三课:卷积神经网络 - 基础篇 提纲: 1. 链式反向梯度传到 2. 卷积神经网络 - 卷积层 3. 卷积神经网络 - 功能层 4. 实 ...

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

    这个问题研究了两天.<windows程序设计>中没有给出实例,MSDN也没有给出具体的例子.在知道,CSDN提问后,也没有得到答案.所以决定重新对DIB做一次彻底的研究,这大概会花去我一个 ...

  4. Quartz2D之生成圆形头像、打水印、截图三种方法的封装

    我给UIImage类添加了一个类目,用于封装三个方法,每个方法都没有难度,做这个主要为了练习一下封装: 首先在类目.h文件中声明三个方法:以及创建了一个枚举.用于水印方法中设定水印位置:方法说明和参数 ...

  5. 新浪微博.Net SDK第三版源代码和示例【最后一次更新了】

    时间过得飞快,距离上次SDK更新已经3年有余.随着官方的不断跟新,老版SDK的部分接口已经不能正常使用.因此在QQ群里来吐槽的.来谩骂的朋友也开始多了起来.随着时代的发展,微博已经彻底的被微信甩开,因 ...

  6. SDK截图程序(二):保存截图

    怎样将我们上一篇截取的位图保存在文件夹里.根据MSDN,思路是这样的,用CreateFile函数在磁盘建立一个bmp文件,用WriteFile填充该bmp文件的文件头.信息头,像素等信息.之前我们只有 ...

  7. SDK截图程序(一)

    程序将系统窗口左上角100*100的图像复制到粘贴板上.程序的关键位置上加上了注释,相关知识<windows程序设计>第14章内容 #include <windows.h> # ...

  8. HTTP协议 (三) 压缩

    之前写过一个篇 [HTTP协议详解] ,这次继续介绍HTTP协议中的压缩. 本文会使用Fiddler来查看HTTP request和Response, 如果不熟悉这个工具,可以先参考[Fiddler教 ...

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

    前两节我们介绍了vmrc sdk的基本用法.在前面的demo中,有一个关键的问题是,我们现在所作的工作都是基于局域网的,作为应用层面上,主机不会直接暴露给用户,而是通过一系列的web service服 ...

随机推荐

  1. git 忽略提交某个指定的文件(不从版本库中删除)

    执行指令: 1 2 [Sun@webserver2 demo]$ git update-index --assume-unchanged config.conf [Sun@webserver2 dem ...

  2. CentOS vsftpd搭建快速流程

    1.yum install vsftpd 2.chkconfig vsftpd on 3.service vsftpd start 4.adduser -d /home/bp -g ftp -s /s ...

  3. 对jQuery ajax三级级联的简单研究

    最近写程序的时候经常遇到使用ajax获取数据的问题,刚好昨天遇到ajax写三级级联问题,自己写了一个简单的级联.对于服务端获取数据的就不多写了,客户端的ajax发送请求我在这里详细说一下,因为我也没专 ...

  4. 如何应用.NET中的消息队列服务

    建立一个队列是应用MSMQ的第一步.您可以通过Windows计算机管理控制台中的消息队列选项完成这一操作,或者自己编程建立一个队列.列表A中的C#代码建立了一个新的私有MSMQ消息队列(如果不存在队列 ...

  5. [html]head区域编写规范

    一.必须加入的标签 1.meta 2.title 3.css 4.字符集 <meta charset="utf-8"/> 二.可加入的标签 1.设定网页到期时间,一旦网 ...

  6. 【Linux】【通信】1.ping不通

    关于为什么ping不通有很多种原因,但直接的表象就网络之间没有成功进行通讯: 在构建虚拟机和win之间的交互时,主要使用了3种网络模式: 桥接bridge VMnet0 主机host     VMne ...

  7. Fibonacci(斐波那契)递归实现。容易看懂

    #include<iostream>using namespace std;int fibonacci(int n){if(n<=0) return 0; else if(n==1) ...

  8. UIApplication详解

    每个app有且只有一个UIApplication对象,当程序启动的时候通过调用UIApplicationMain方法得到的.可以通过sharedApplication方法得到. UIApplicati ...

  9. SpringMVC与MyBatis整合之日期格式转换

    在上一篇博客<SpringMVC与MyBatis整合(一)——查询人员列表>中遗留了日期格式转换的问题,在这篇记录解决过程. 对于controller形参中pojo对象,如果属性中有日期类 ...

  10. hibernate的1+n

    对数据库访问还是必须考虑性能问题的, 在设定了1 对多这种关系之后, 查询就会出现传说中的n +1 问题. 1 )1 对多,在1 方,查找得到了n 个对象, 那么又需要将n 个对象关联的集合取出,于是 ...