加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

几种图片压缩算法

(2015-10-22 20:06:29)
标签:

it

分类: 图片相关

压缩数据的基本组成:控制符+数据

1、Run-length

控制符表示后面数据的重复次数,实际运算时重复次数=控制符+1。控制符取值0~255,对应重复次数1~256。

数据(十六进制):01 01 01 02 03 04 05 06 06

压缩后(十六进制):02 01 00 02 00 03 00 04 00 05 01 06

该方法比较简单,压缩后的数据可能比压缩前大的多。

 

2、TIFF

针对Run-length做了改进,控制符分为3类:重复次数,数据个数,无操作。各类对应的控制符范围如下

控制符               类型                      实际运算值          

-1 ~ -127         重复次数                控制符绝对值 + 1

~ 127            数据个数                控制符 + 1

-128                 无操作

举例时,控制符采用十进制表示,其它都是十六进制。

数据(十六进制):01 01 01 02 03 04 05 06 06

压缩后:-2 01 +3 02 03 04 05 -1 06

解析一下压缩数据:

-2表示重复次数= -(-2) + 1 = 3,后面数据是01,即01 01 01。

+3表示数据个数 = 3 + 1 = 4,即后面有4字节数据,02 03 04 05。

-1表示重复次数= -(-1) + 1 = 2,后面数据是06,即06 06。

 

3、Delta Row

该压缩方法是针对行的,即一行为一个整体。

控制符低5位表示偏移量offset,高3位(+1)表示数据个数dataCount。

 

开始时数据为全0,以一行15个字节为例:

00 00 00 00 00   00 00 00 00 00    00 00 00 00 00

压缩数据(十六进制):01 0a

控制符:01 = 000 00001,offset=00001=1,dataCount = 000 + 1 = 1,数据为0a。得到第一行:

00 0a 00 00 00   00 00 00 00 00    00 00 00 00 00

压缩数据(十六进制):23 0b 0c 01 0d

控制符:23 = 001 00011,offset=00011=3,dataCount = 001 + 1 = 2,数据为0b 0c。现在offset变为3 + 2=5,接着分析,控制符:01 = 000 00001,offset=5(前面的offset) + 00001=6,dataCount = 000 + 1 = 1,数据为0d。得到第二行:

00 0a 00 0b 0c   00 0d 00 00 00    00 00 00 00 00 

 

当offset为11111时,表示offset太大继续取后一字节作为offset,直到后一字节不为0xff。现在弄一行300字节数据为例:

数据偏移:0      ......   ......   ......     285  286 287 288 289 290 291 292  ......  299

数据 :      00 00 00 00 ......   ......   ......     00    00   00    00  00   00   00   00    ......  00

压缩数据(十六进制):3f ff 01 0a 0b

控制符:3f  = 001 11111,offset=11111 + 0xff + 0x01=31 + 255 + 1 =287,dataCount = 001 + 1 = 2,数据0a 0b。得到第一行:

数据偏移:0      ......   ......   ......     285  286 287 288 289 290 291 292  ......  299

数据 :      00 00 00 00 ......   ......   ......     00    00   0a    0b  00   00   00   00    ......  00

 

 备注:

1、上面的压缩算法可以组合起来用,用一字节表示采用哪种压缩算法就行。例如:

压缩数据:01 Run-length数据

压缩数据:02 TIFF数据

压缩数据:03 Delta Row数据

2、可以由上面的压缩算法推出某种新的算法,mode 1030就是由TIFF和Delta Row揉合在一起弄出来的。具体说起来特别麻烦,关键点还是在控制符上:次高几位表示Delta Row里的offset,低几位表示TIFF里的重复次数或数据个数,表示重复次数还是数据个数的判断跟TIFF的判断基本是一样的。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有