几种图片压缩算法
(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
0
-128
举例时,控制符采用十进制表示,其它都是十六进制。
数据(十六进制):01 01 01 02 03 04 05 06 06
压缩后:-2 01 +3 02
解析一下压缩数据:
-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
压缩数据(十六进制):01 0a
控制符:01 = 000 00001,offset=00001=1,dataCount = 000 + 1 = 1,数据为0a。得到第一行:
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
当offset为11111时,表示offset太大继续取后一字节作为offset,直到后一字节不为0xff。现在弄一行300字节数据为例:
数据偏移:0
数据
压缩数据(十六进制):3f
控制符:3f
数据偏移:0
数据
1、上面的压缩算法可以组合起来用,用一字节表示采用哪种压缩算法就行。例如:
压缩数据:01 Run-length数据
压缩数据:02 TIFF数据
压缩数据:03 Delta Row数据
2、可以由上面的压缩算法推出某种新的算法,mode 1030就是由TIFF和Delta Row揉合在一起弄出来的。具体说起来特别麻烦,关键点还是在控制符上:次高几位表示Delta Row里的offset,低几位表示TIFF里的重复次数或数据个数,表示重复次数还是数据个数的判断跟TIFF的判断基本是一样的。