为什么ZIP文件压缩不了多少?
把一堆照片或视频打包成ZIP,体积几乎不变。这里讲清楚为什么ZIP对已经压缩过的文件几乎榨不出什么空间。

你把一堆度假照片打包成ZIP,本以为文件会变小,结果压缩包出来的大小几乎没变,有时候甚至还大了一两兆。这不是工具坏了。ZIP做的正是它该做的事,只是这些文件在被打包之前就已经压缩过了,ZIP已经榨不出多少空间。
ZIP到底在找什么#
ZIP压缩包用的是一种叫DEFLATE的算法,定义在RFC 1951里。DEFLATE能找到两种省空间的机会:一是重复出现的字节序列,可以用更短的引用来代替;二是某些字节值出现的频率远高于其他值,可以用更少的比特来编码。这两个技巧都依赖同一件事:原始数据里的冗余,也就是那些模式和重复。
一份纯文本文件、一张表格、一份日志文件,或者一张没压缩过的BMP图片,里面全是这种冗余:重复的单词、重复的列数据、大片相同颜色的像素。DEFLATE处理这些游刃有余,所以一堆.txt或.csv文件打包后能缩小60%到90%。
为什么照片、视频和PDF几乎不变#
一张JPG、一个MP4、一首MP3,还有大多数PDF,在它们到达创建ZIP工具之前,冗余早就被去掉了。JPEG自己的编码器已经用熵编码把图片压到接近它的实际极限;H.264和H.265对视频做的是同样的事,MP3和AAC对音频也是如此。等DEFLATE拿到这些数据时,它赖以生存的重复模式基本上已经不存在了。它不是失败了,只是几乎没有活可干了,所以打包出来的ZIP文件大小和原文件差不多,算上文件头和每个文件的管理开销,有时候甚至会稍微大一点。
这也是为什么打包.docx、.xlsx或.pptx文件几乎没用:这些Office格式本身内部就是ZIP压缩包,装的是已经压缩过的XML。相当于用ZIP去压缩一个ZIP。
| 文件类型 | 典型ZIP压缩率 |
|---|---|
| 纯文本、CSV、日志文件 | 60%-90% |
| 未压缩的BMP或WAV | 50%-80% |
| Word/Excel/PowerPoint (.docx, .xlsx, .pptx) | 0%-5%(内部本来就是ZIP) |
| JPG、PNG、MP4、MP3 | 0%-3%,有时还会稍大 |
那照片或视频到底该怎么变小#
不是再打包一次。真正决定压缩效果的是图片或视频的编码格式,所以要缩小文件,得从那里下手。把照片放进图片压缩工具,用较低的质量设置重新编码,这跟ZIP是完全不同的操作:它可以有针对性地牺牲一部分细节来换取体积,而ZIP里的DEFLATE从来不允许丢失任何东西。想知道怎么选质量参数又不留下明显痕迹,可以看看如何在不损失质量的情况下压缩图片这篇文章。
已经压缩过的文件,什么时候打包ZIP还是有意义的#
即使ZIP没法让照片或视频明显变小,它还是有别的用处:把文件打包在一起。如果你想把十二个文件当成一个附件发出去,或者把一个项目的素材打包成一个下载文件,创建ZIP工具可以直接在浏览器里完成这件事,不用上传,压缩率高不高都无所谓。另一边,解压ZIP工具可以把压缩包还原成原来的文件。如果想从头学怎么打包和命名压缩包,可以看看如何把文件压缩进一个ZIP文件夹这篇文章,博客的技术专栏里还有更多关于压缩格式底层原理的内容。
常见问题#
为什么我的ZIP文件比原文件还大? 如果压缩包里的文件本身已经压缩过了(比如JPG或MP4),ZIP文件有可能比原文件稍大一点,因为DEFLATE找不到可以去除的冗余,而压缩包本身还会给每个文件额外加上一点文件头和管理数据。
把JPG或PNG打包成ZIP会损失质量吗? 不会,ZIP是无损格式,放进去的每一个字节解压后都会原样还原;只是它通常没办法让一张已经压缩过的图片变得更小。
有没有办法把照片和视频压缩得比ZIP更狠? 有,用图片压缩工具这类懂编码格式的工具,它能有针对性地降低质量,在这类数据上把体积压缩得比ZIP狠得多。
为什么Word或Excel文件打包后几乎不变小?
现在的.docx、.xlsx、.pptx文件本身内部就是装着已压缩XML的ZIP压缩包,再套一层ZIP基本没什么可压的了。
如果文件不会变小,打包ZIP还值得吗? 值得,如果目的是打包而不是压缩:一个ZIP能把很多文件合成一个,哪怕压缩率是0%,当成附件或下载文件也很有用。
简单总结#
试用这些工具
免费、私密、即时——一切都在你的浏览器中运行。


