你所能用到的无损压缩编码(一)

本文介绍了无损压缩编码技术,重点讨论了RLE(Run-Length Encoding)算法的工作原理、应用场景及其优缺点。通过示例展示了RLE如何压缩和解压缩数据,并提供了简单的C/C++实现。在某些情况下,压缩后的数据可能会增加,因此选择合适的压缩算法至关重要。
摘要由CSDN通过智能技术生成

      这个系列将结合C/C++介绍无损压缩编码的实现,正如Charles Petzold在<CODE:Hidden Language of Computer Hardware and Software>里所表达出来的意思一样,计算机最本质的能力就是将各种信息通过电路的开合转换成为一系列的数字,然后对其按照一定的规则进行编码,利用这些编码记录一些动作或者数据,完成人们想要的功能。计算机的指令是一种编码,数据也是一种编码,正如人类用各自民族特有的符号组成自己的语言一样,计算机也是依靠着编码形成了自己的语言。计算机的需要存储大量的数据,虽然现在的硬盘已经容量越来越大,但是如何存储更多的内容永远是计算机科学家不断追求的一个方向,压缩编码就像语言中的简称一样,使用尽量少的空间来存储和表达完整或者重要的信息。比如在日常生活中你会把电子计算机简称为计算机,本来五个字的内容现在只要三个字表达,但是完全没有改变其所表达的意思,这也是一种压缩。

     压缩编码是一种在计算机中常用的技术,在现代的电脑中基本无处不在,特别是在现在电脑中存储有大量的图片,视频的情况下,压缩编码几乎运用于所有格式的多媒体信息中,使得电脑可以更多的存储大量丰富的多媒体信息。人们根据从压缩编码中是否能完整无误的恢复出原始信息,又将压缩编码分成无损压缩和有损压缩两种,无损压缩就是可以通过压缩之后内容完整无误的恢复出原始信息,而有损压缩不是说不能恢复出原始信息,而是能够部分的恢复出原始信息,而这恢复的信息一般都是重要的信息,所谓损失是损失的次要信息,广泛使用的JPEG格式图片所采用的算法就是一种有损压缩的方法,它利用图像本身相关性很强的性质将原始图像数据进行有损压缩之后,然后解压缩呈现给用户的还是能够看到比较完整的原始图像。截止到现在,已经有很多有损压缩和无损压缩编码技术,对于压缩编码的研究也一直是多媒体的一个研究热点。

     既然是介绍无损压缩编码,那么就从最简单的RLE开始,RLE 全称Run-Length Encoding,一个接受的比较光的是行程编码,首先,让我们看一下RLE在Wiki中的定义:

     Run-length encoding (RLE) is a very simple form of data compression in which runs of data (that is, sequences in which the same data value occurs in many consecutive data elements) are stored as a single data value and count, rather than as the original run. This is most useful on data that contains many such runs: for example, simple graphic images suchas icons, line drawings, and animations. It is not useful with files that don't have many runs as it could greatly increase the file size.

     从定义中可以看出来,所谓的行程编码就是记录连续数据的行程(runs)长短和数值本身(data),压缩之后的编码分成两组,value值和count值,value值就是连续出现的data值,count是其连续出现的次数。定义中也说了RLE对重复数据比较集中出现的数据压缩效果比较好,也就是行程长的数据,所以RLE主要应用于二值图像之中,如果相同数据连续出现的比较少,那么RLE压缩的效果将会很不理想,大部分情况下会越压缩越大。

     下面举个例子,比如000001111100000,使用RLE进行无损压缩之后是5 0 5 1 5 0, 可以看到本来使用15个数字的现在使用6个数字就能保存,大大减少了需要存储的数字的空间,这样也就是达到了压缩的目的。但是,反过来,如果数据是0101010101,那么使用RLE压缩后的结果就是1 0 1 1 1 0 1 1 1 0 1 1 1 0 1 1 1 0 1 1,本来只需要10个空间存储的数据,现在压缩之后变成了需要20个空间来存储,如果是1M的文件的话,那么压缩之后就变成2M。这也部分解释了为什么有时候使用压缩软件压缩文件,压缩之后的文件大小比原始文件大小还要大,所以压缩算法也不是完全就能实现压缩功能的,不光是对于RLE,对于大部分压缩算法,都有出现越压缩越大的可能。

     上面所叙述的都是压缩算法的原理,按照这些原理,就能编写出RLE压缩算法的程序,但是爱因斯坦说过: “ 从理论上说理论和实践是一回事,但是从实践上说他们不是一回事 ” ,所以在使用RLE压缩的时候,还要处理一个问题,先给大家展示下我的函数:

  

 1 //RLE压缩算法函数
 2 //输入:原始数据,原始信息长度,压缩数据
 3 //输出:压缩率
 4 double RLE(int input[],long inputLenth,int output[])
 5 {
 6     int count=1;//
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值