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服 ...
随机推荐
- 《企业应用架构模式》(POEAA)读书笔记
原文地址:<企业应用架构模式>(POEAA)读书笔记作者:邹齐龙(技术-5013 什么是架构 Rolph Johnson认为:架构是一种主观上的东西,是专家级的项目开发人员对系统设计的一些 ...
- Android App的签名打包三步骤
1.签名的意义 为了保证每个应用程序开发商合法ID,防止部分开放商可能通过使用相同的Package Name来混淆替换已经安装的程序,我们需要对我们发布的APK文件进行唯一签名,保证我们每次发布的版本 ...
- 部署私有的Nuget服务器
1.查看官方的部署文档:http://docs.nuget.org/Create/Hosting-Your-Own-NuGet-Feeds 2.使用开源的项目:https://github.com/h ...
- wxPython入门练习代码 一
Bare.py: #1.导入必须的wxPython包 import wx #2.子类化wx应用程序类 class App(wx.App): #3.定义应用程序初始化方法 def OnInit(self ...
- MVC是什么?
MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑.数据.界面显示分离的方法组织代码 ...
- Android中的slidingmenu
简介 SlidingMenu作为滑动侧边栏主要用来代替Android传统的Menu菜单. 导入方法 SlidingMEnu以前依赖于另一个开源库ActionBarSherlock,但是现在被AppCo ...
- 《JavaScript高级程序设计》读书笔记--(3)引用类型
ECMAScript从技术来说是一门面向对象的语言,但不具备传统的面向对象语言所支持的类和接口等基本结构.虽然引用类型与类看起来类似,但是他们并不是相同的概念.引用类型有时也被成为对象定义,因为它描述 ...
- mysql数据类型和列属性
列属性: 定义一个字段时对该字段设置的额外的信息或约束 1. 关联操作:reference 2. 字段默认值:default value 3. 主索引和唯一索引:primary key 和uni ...
- python常用的内置库
标准库: import os os.getcwd() //返回当前工作路径 os.chdir('/server/accesslogs') # Change current working dir ...
- java读取大文件
1 多线程 2 java内存映射读取大文件