行程长度编码的RLE 压缩算法的基本原理

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了行程长度编码的RLE 压缩算法的基本原理相关的知识,希望对你有一定的参考价值。

参考技术A

RLE(Run- Length Encoding 行程长度编码)压缩算法是Windows 系统中使用的一种图像文件压缩方法, 其基本思想是: 将一扫描行中颜色值相同的相邻像素用两个字节来表示, 第一个字节是一个计数值, 用于指定像素重复的次数; 第二个字节是具体像素的值[2]。主要通过压缩除掉数据中的冗余字节或字节中的冗余位,从而达到减少文件所占空间的目的。例如, 有一表示颜色像素值的字符串RRRRRGGBBBBBB,用 RLE 压缩方法压缩后可用 5R2G6B 来代替,显然后者的串长度比前者的串长度小得多。译码时按照与编码时采用的相同规则进行, 还原后得到的数据与压缩前的数据完全相同。因此, RLE 是无损压缩技术。

算法题:RLE压缩算法(游程编码)的Java实现

RLE全称run-length encoding,又称为游程编码,或者长度编码变动长度编码法run coding)。例如,我们输入字符串"qwweeerrrrttttt",经过压缩之后的输出结果应该为"1q2w3e4r5t"。
以下分别使用Java递归和尾递归的方式来实现。

  • 递归方式实现
    public static String RLECompress(String source) 
        if (source.length() <= 1) return source;

        int runLength = 1;
        while (runLength < source.length() && source.charAt(0) == source.charAt(runLength)) 
            runLength++;
        

        return runLength + source.substring(0, 1) + RLECompress(source.substring(runLength));
    
  • 尾递归方式实现
    public static String RLECompressWithTail(String source, String result) 
        if (source.length() <= 0) return result;

        int runLength = 1;
        while (runLength < source.length() && source.charAt(0) == source.charAt(runLength)) 
            runLength++;
        
        result += runLength + source.substring(0, 1);
        return  RLECompressWithTail(source.substring(runLength), result);
    

参考
//http://www.6tie.net/p/908340.html

以上是关于行程长度编码的RLE 压缩算法的基本原理的主要内容,如果未能解决你的问题,请参考以下文章

图像压缩基于行程编码实现的图像压缩matlab源码

算法题:RLE压缩算法(游程编码)的Java实现

算法题:RLE压缩算法(游程编码)的Java实现

JPEG格式压缩算法

gzip 所使用压缩算法的基本原理(选摘)

G.711编码原理