压缩位图我们使用简单的行程长度编码的方法,详情参考《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. winform碎片

    1.通过同一个pictureBox控件加载不同的图片,在加载前需要释放控件里之前的Image. pictureBox1.Image.Dispose();//Dispose之后对象就不存在了,只能重新C ...

  2. c#判断IP是否可以Ping通

    Ping pingSender = new Ping(); PingReply reply = pingSender.Send("127.0.0.1",120);//第一个参数为i ...

  3. Jquery开灯关灯效果

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. ubuntu14.04 wifi驱动

    ubuntu崩溃后再安装后,发现没有了wifi按钮 因为必须要用wifi不然太不方便了,于是在网上找了一下,安装了一下驱动就解决了 首先确定无线网卡类型: $ lspci -vnn -d 14e4: ...

  5. Emacs 参考资料

    1.EmacsWiki: http://www.emacswiki.org/emacs?interface=zh-cn 2.相关博客:     http://blog.csdn.net/redguar ...

  6. android 混淆导致友盟反馈出错

    最近混淆应用时出现了一个错误: 打包编译没问题,但程序运行之后,点击友盟的反馈就会导致程序报错: E/AndroidRuntime(7669):  java.lang.RuntimeException ...

  7. Ionic的跨域问题

    跨域大家都不陌生,但最近一直遇到一个坑,也是自身对ajax和angular的不深入造成,所以记录一笔,下次遇到绕过. 参考过:http://ionichina.com/topic/54f051698c ...

  8. XCode修改公司名称和作者名称

    新建的文件最上方都会有一段类似如下的版权声明 // //  ViewController.m //  CBDemoProject001 // //  Created by CB on 16/3/17. ...

  9. android 保存Bitmap 到本地 哦

    public String saveImage(Bitmap bmp) { File appDir = new File(Environment.getExternalStorageDirectory ...

  10. MATLAB中FFT的使用方法

    MATLAB中FFT的使用方法 说明:以下资源来源于<数字信号处理的MATLAB实现>万永革主编 一.调用方法X=FFT(x):X=FFT(x,N):x=IFFT(X);x=IFFT(X, ...