RLE压缩算法的主要思想:
- 对于连续重复的数据
- 假如原始数据有5字节的连续重复数据
[A][A][A][A][A]
- 以
[(1<<8)+data_num][A]
代替,data_num
最大值为127,即低7位用来表示数据重复长度,最高位1为重复数据的标识位
- 对于连续非重复的数据
- 假如有5字节的连续非重复数据
[B][C][D][E][F]
- 以
[(0<<8)+data_num][B][C][D][E][F]
,同样data_num
最大值为127,即低7位用来表示连续非重复数据长度,最高位0为非重复数据的标识位
- 数据重复出现x以上才算做连续重复数据的策略
- 是为了尽量优化对短重复数据间隔出现时的压缩效率
- 例如对于
[A][A][B][C][C][D]
:- 如果不采用这个策略,压缩后为
[0x82][A][0x01][B][0x82][C][0x01][D]
,为8字节。 - 如果采用该策略,则上述数据被认定为连续非重复数据,压缩后为
[0x06][A][A][B][C][C][D]
,为7字节。
- 如果不采用这个策略,压缩后为
- 如何区分长度属性字节和数据字节
- 上述采用
([长度属性字节]-[重复数据或非重复数据]-[长度属性字节]-[重复数据或非重复数据])
的形式 - 另一种标识方式:
- PCX_RLE图像压缩算法
- 根据长度属性字节的最高位和次高位来标识这个标志,对于连续非重复数据不适用任何标识字节。
- 如果一个数据的最高两个比特都是1,说明这是一个长度属性字节,其低6位表示重复数据的长度,如果最高两位不都是1,则表示该字节本身就是非重复数据。
- 这样一来引入了一个冲突,即非重复数据本身最高两位恰好为1。PCX_RLE的解决办法是将这样的数据当作长度为1的连续重复数据处理,也就是在数据前面加上一个
0xC1
标识。