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字节时,整个图像的解码就宣告完成。
SDK截图(三):压缩位图之理论准备篇的更多相关文章
- 三分钟分布式CAP理论
分布式系统架构理论,定义了三种指标,理论说我们最多只能满足两个. ## 分布式系统 首先我们这个理论所说的分布式系统,是指系统内会共享数据,互相有连接有交互,才能完成系统功能的的分布式系统.而这个理论 ...
- 【原创 深度学习与TensorFlow 动手实践系列 - 3】第三课:卷积神经网络 - 基础篇
[原创 深度学习与TensorFlow 动手实践系列 - 3]第三课:卷积神经网络 - 基础篇 提纲: 1. 链式反向梯度传到 2. 卷积神经网络 - 卷积层 3. 卷积神经网络 - 功能层 4. 实 ...
- SDK截图(四):压缩位图实例
这个问题研究了两天.<windows程序设计>中没有给出实例,MSDN也没有给出具体的例子.在知道,CSDN提问后,也没有得到答案.所以决定重新对DIB做一次彻底的研究,这大概会花去我一个 ...
- Quartz2D之生成圆形头像、打水印、截图三种方法的封装
我给UIImage类添加了一个类目,用于封装三个方法,每个方法都没有难度,做这个主要为了练习一下封装: 首先在类目.h文件中声明三个方法:以及创建了一个枚举.用于水印方法中设定水印位置:方法说明和参数 ...
- 新浪微博.Net SDK第三版源代码和示例【最后一次更新了】
时间过得飞快,距离上次SDK更新已经3年有余.随着官方的不断跟新,老版SDK的部分接口已经不能正常使用.因此在QQ群里来吐槽的.来谩骂的朋友也开始多了起来.随着时代的发展,微博已经彻底的被微信甩开,因 ...
- SDK截图程序(二):保存截图
怎样将我们上一篇截取的位图保存在文件夹里.根据MSDN,思路是这样的,用CreateFile函数在磁盘建立一个bmp文件,用WriteFile填充该bmp文件的文件头.信息头,像素等信息.之前我们只有 ...
- SDK截图程序(一)
程序将系统窗口左上角100*100的图像复制到粘贴板上.程序的关键位置上加上了注释,相关知识<windows程序设计>第14章内容 #include <windows.h> # ...
- HTTP协议 (三) 压缩
之前写过一个篇 [HTTP协议详解] ,这次继续介绍HTTP协议中的压缩. 本文会使用Fiddler来查看HTTP request和Response, 如果不熟悉这个工具,可以先参考[Fiddler教 ...
- vmware之VMware Remote Console (VMRC) SDK(三)
前两节我们介绍了vmrc sdk的基本用法.在前面的demo中,有一个关键的问题是,我们现在所作的工作都是基于局域网的,作为应用层面上,主机不会直接暴露给用户,而是通过一系列的web service服 ...
随机推荐
- org.apache.catalina.webresources.Cache.getResource Unable to add the resource
org.apache.catalina.webresources.Cache.getResource Unable to add the resource at xxx to the cache be ...
- Ingress 记萌新的第一次连多重(xjbl)
之前为了升七,ArtanisWei学长告诉我可以去紫金园雕塑[这是什么地方啊],顺带靠卖萌骗了一桶key 于是屁颠屁颠的跑去按照群里攻略开始连多重[馒头 by handsomepeach],连了一百年 ...
- oracle 存储过程访问其他用户的表
用户user2想在存储过程中查询用户User1的表table1, 在PL/SQL中用user1登陆,执行以下语句即可: grant select on User1.table1 to user2;
- react参考项目001
https://github.com/chen2009277025/webpack-ant-design-demo https://github.com/cobish/cobish.github.io ...
- Linux开源系统对比Windows闭源系统的优势解析
当我们听到linux的时候是不是觉得高大上的感觉呢?在我刚上大学的时候,听着学长们给我讲他们的大学的学习经历,先学习C语言.单片机.然后做一些项目,现在正学习linux操作系统,当我听到linux操作 ...
- python网络编程【三】(网络服务器)
建立一个服务器需要以下4步: 1.建立socket对象. 2.设置socket选项(可选的) 3.绑定到一个端口(同样,也可以是一个指定的网卡). 4.侦听连接. 下面代码片段可以实现这些功能: ho ...
- http Content-type对照表
http://tools.jb51.net/table/http_content_type Content-Type,内容类型,一般是指网页中存在的Content-Type,用于定 义网络文件的类型和 ...
- D2.Reactjs 操作事件、状态改变、路由
下面内容代码使用ES6语法 一.组件的操作事件: 1.先要在组件类定义内定义操作事件的方法,如同event handler.若我需要监听在组件内的Button的点击事件onClick,首先定义监听方法 ...
- 制造行业流程管理的“IPO”思维
流程管理是企业从流程角度出发,关注流程是否增值的一套管理体系.从认识流程.到建立流程.到管理流程.再到优化流程,企业管理人员要去除不增值和低价值的流程,减少员工犯错误的机会,建立一套卓越的流程体系. ...
- MEAN.JS入门
MEAN stands for: 下载:MongoDB下载文件 百度盘共享 运行命令:mongod 提示你dbpath(/data/db/) does not exist, terminating 创 ...