一号热搜榜,为您提供最新的热搜资讯,热搜榜信息!

为什么文件压缩后能变小?无损压缩真的不会丢失数据吗?

百科热搜 作者: 同行视界 热度:278


            为什么文件压缩后能变小?无损压缩真的不会丢失数据吗?

我们几乎每天都会和压缩文件打交道:网上下载的软件、资料,大多是 ZIP、RAR 格式的压缩包;要给别人传大量的文件、照片,会先把它们打包压缩,不仅体积变小了,传输也更方便;甚至我们日常用的 JPG 图片、MP3 音乐、MP4 视频,本质上也都是压缩后的文件。很多人都会好奇:为什么文件压缩之后,体积能变小这么多?那些被压缩掉的空间,到底是什么?我们常说的无损压缩,真的不会丢失任何数据吗?解压之后,文件会和原来的一模一样吗?


            为什么文件压缩后能变小?无损压缩真的不会丢失数据吗?

很多人对文件压缩的认知,觉得就像把衣服塞进真空袋,抽掉空气,体积变小了,拿出来之后,衣服还是原来的样子,没有任何变化。但事实上,文件压缩的原理,远比真空压缩要复杂得多,它的核心不是 “抽掉空气”,而是通过一套极其巧妙的编码算法,去掉文件里的冗余数据,用更短的编码,来表示重复的内容,从而在不丢失数据的前提下,缩小文件的体积。


            为什么文件压缩后能变小?无损压缩真的不会丢失数据吗?

想要搞懂文件压缩的原理,我们先要明白,电脑里的所有文件,本质上都是一串由 0 和 1 组成的二进制数据,无论是文档、图片、视频,还是软件、安装包,最终都会被转换成无数个 0 和 1,存储在硬盘里。而文件压缩的核心,就是对这些二进制数据,进行重新编码,用更短的编码,替代原来更长的、重复的编码,从而减少文件占用的存储空间。


            为什么文件压缩后能变小?无损压缩真的不会丢失数据吗?

我们先来说最基础的压缩原理:去重编码,也就是我们常说的行程长度编码,这是最简单、最基础的压缩算法。举个最简单的例子,一个文本文件里,有这样一串字符:“AAAAAABBBBBCCCCCCDDDD”,也就是 6 个 A、5 个 B、6 个 C、4 个 D。如果不压缩,我们需要存储 21 个字符,每个字符占 1 个字节,一共需要 21 个字节的存储空间。

而用行程长度编码,我们可以把这串字符,重新编码成 “6A5B6C4D”,只需要 8 个字符,就能完整表示原来的内容,存储空间直接缩小了一半还多。解压的时候,只需要按照编码规则,把 “6A” 还原成 6 个 A,“5B” 还原成 5 个 B,就能得到和原来完全一模一样的文件,没有任何数据丢失,这就是最基础的无损压缩。

当然,这只是最简单的例子,实际的压缩算法,远比这个复杂得多,其中最经典、应用最广泛的,就是 LZ77/78 算法和哈夫曼编码,我们日常用的 ZIP、RAR 压缩格式,核心就是这两种算法的结合。

LZ77 算法的核心逻辑,是 “滑动窗口匹配”,简单来说,就是算法会在文件里,寻找重复出现的字符串,然后用 “距离 + 长度” 的编码,来替代重复的内容。比如,一段文本里,前面已经出现过 “科普中国” 这四个字,后面再次出现的时候,算法不会再重复存储这四个字的编码,而是会记录下 “这四个字,在前面多少个字符的位置出现过,长度是 4”,用两个数字,就能替代原来四个字符的存储空间。

文件里的重复内容越多,这种算法的压缩效果就越好。比如一个 Word 文档,里面有大量重复的词语、句式;一个安装包,里面有大量重复的代码和资源文件,用这种算法,能把文件体积缩小好几倍。而如果文件里的内容都是随机的、没有重复的,那压缩的效果就会很差,甚至可能压缩之后,文件体积反而变大了,因为编码本身也需要占用存储空间。

而哈夫曼编码,是另一种核心的压缩算法,它的核心原理,是 “用最短的编码,表示出现频率最高的内容”。举个例子,一个文本文件里,“的” 这个字出现的频率最高,占了所有字符的 20%,“是” 字出现的频率次之,占了 10%,而 “饕”“餮” 这种生僻字,出现的频率极低,只占了 0.01%。

在不压缩的情况下,每个汉字都占用 2 个字节,也就是 16 个二进制位,不管出现的频率高低,占用的空间都是一样的。而哈夫曼编码,会给出现频率最高的 “的” 字,分配一个最短的编码,比如 2 个二进制位;给出现频率次之的 “是” 字,分配 3 个二进制位;给出现频率极低的生僻字,分配较长的编码。这样一来,整个文件里,出现频率最高的内容,占用的存储空间最少,整体的文件体积,就会大幅缩小。

解压的时候,算法会按照对应的编码表,把短编码还原成原来的字符,最终得到的文件,和压缩前的原文件,每一个字符、每一个二进制位,都是完全一模一样的,没有任何数据丢失,这就是我们常说的无损压缩。我们日常用的 ZIP、RAR、7Z 格式,还有文档用的 PDF 格式、图片用的 PNG 格式,都属于无损压缩,无论压缩多少次,解压之后的文件,都和原文件完全一致,不会有任何失真。

讲到这里,很多人都会问:既然无损压缩能缩小文件体积,还不会丢失数据,那我们能不能把一个文件,反复压缩,让它变得越来越小,甚至压缩到 1KB?答案是绝对不能。因为无损压缩,只能去掉文件里的冗余数据,也就是重复的内容,当文件里的冗余数据被全部去掉之后,就再也无法压缩了。如果强行再次压缩,不仅不会让文件变小,反而会因为新增的编码信息,让文件体积变大。就像你把衣服放进真空袋,抽一次真空,体积就已经缩到最小了,再抽多少次,也不会变得更小。

除了无损压缩,还有一种我们日常接触更多的压缩方式,就是有损压缩,我们常听的 MP3 音乐、看的 MP4 视频、拍的 JPG 图片,都属于有损压缩。和无损压缩不同,有损压缩会直接删掉文件里,人眼、人耳无法感知的冗余数据,从而大幅缩小文件的体积,当然,这个过程会丢失一部分原始数据,只是我们的感官无法察觉而已。

比如,一张 RAW 格式的原始照片,体积能达到几十 MB,它完整保留了相机传感器捕捉到的所有光影、色彩细节。而我们把它转换成 JPG 格式的时候,算法会删掉人眼无法分辨的色彩细节、光影渐变,把人眼敏感的亮度信息保留下来,把人眼不敏感的色彩信息压缩,最终生成的 JPG 图片,体积只有几 MB,人眼看起来和原图几乎没有区别,但实际上已经丢失了大量的原始数据,压缩比例越高,丢失的细节就越多,放大之后就会看到模糊、色块、噪点。

同样的,MP3 音乐格式,会删掉人耳听不到的高频和低频声音,把我们能听到的核心声音保留下来,从而把几十 MB 的 WAV 无损音乐,压缩到几 MB 的 MP3 文件,普通人用普通的耳机,几乎听不出区别;MP4 视频格式,会删掉人眼无法察觉的画面细节,比如快速运动的画面里,相邻两帧之间重复的内容,从而把几十 GB 的原始视频,压缩到几百 MB,我们看起来依然清晰流畅。

有损压缩的优势,是压缩比例极高,能把文件体积缩小几十倍甚至上百倍,非常适合用于图片、音频、视频这些多媒体文件,因为这些文件里,有大量人眼、人耳无法感知的冗余数据,删掉之后,不会影响我们的观看和收听体验,却能大幅缩小文件体积,方便存储和传输。当然,如果压缩比例过高,丢失的数据太多,我们就会感受到明显的失真:图片变得模糊、音乐出现杂音、视频出现马赛克,这就是过度有损压缩带来的问题。

了解了无损压缩和有损压缩的区别,我们就能知道,什么时候该用哪种压缩方式。如果我们要压缩的是文档、安装包、源代码、工程文件这些,必须保证数据完整、不能有任何丢失的文件,就必须用 ZIP、7Z 这些无损压缩格式,确保解压之后的文件和原文件完全一致;如果我们要压缩的是图片、音乐、视频这些多媒体文件,想要在观感变化不大的前提下,大幅缩小文件体积,就可以用 JPG、MP3、MP4 这些有损压缩格式,平衡画质和文件体积。

从 1951 年第一个压缩算法诞生,到如今的各种高效压缩格式,几十年的时间里,压缩技术一直在不断进步,它用最巧妙的编码算法,让我们能用更小的存储空间,存放更多的文件,用更少的流量,传输更多的内容。我们日常的每一次文件传输、每一次照片分享、每一次视频播放,背后都离不开压缩技术的支撑。了解了文件压缩的原理,我们就能更好地选择合适的压缩格式和算法,既能缩小文件体积,又能保护好我们的文件数据,让存储和传输变得更高效。

标签: 文件     数据