oCompress 的工作原理
拖入文件后会发生什么,如何验证没有上传任何东西,以及无损和有损压缩的真正含义。
简而言之
当您打开一个工具页面时,浏览器会下载页面和一个小程序,也就是压缩程序。当您添加文件时,浏览器读取文件,压缩程序在您自己的处理器上处理它,结果再以下载的形式交还给您。整个过程中,文件始终不会通过网络发送。完整流程如下:
- 加载。页面和工具界面最先加载。某类文件的压缩引擎(图片、视频与音频,或文档)只有在您添加了对应文件时才会获取,所以您永远不会下载用不上的代码。
- 读取。浏览器只允许页面访问您所选的那些文件,设备上的其他任何内容都无法访问。
- 压缩。处理在 Web Worker(浏览器的后台线程)中运行,所以页面始终保持响应,您随时可以取消。
- 保存。压缩后的文件在内存中生成(大视频则在浏览器的私有存储中生成),并通过浏览器的常规下载功能保存,可以逐个下载,也可以打包成 ZIP。
浏览器中运行着什么
现代浏览器可以通过 WebAssembly 以接近原生的速度运行编译后的代码,还能通过名为 WebCodecs 的接口让网页使用设备的硬件视频编码器。oCompress 两者都用到了:
- 图片:JPEG 用 MozJPEG,PNG 用 OxiPNG 和调色板量化器,WebP 用 Google libwebp 中的编码器,AVIF 用 libavif,SVG 用 SVGO,GIF 和 TIFF 则有专门的解码器和编码器。JPEG、PNG、WebP 和 AVIF 的编解码器都编译成了 WebAssembly。
- 视频和音频:WebCodecs 加上 Mediabunny 库,用于读写 MP4 和 WebM 等容器。编码时会尽可能使用显卡芯片的硬件编码器,所以即使在浏览器中也能很快。MP3 文件由 LAME 编码器写入,FLAC 文件由 libFLAC 写入,两者都编译成了 WebAssembly,只在需要时才加载。
- 文档:我们基于开源 PDF 和 ZIP 库编写的代码会打开 PDF 和 Office 文件,用图片编解码器重新压缩其中的图片,然后写出一个新文件。
我们附带的每个库都是开源的:大多数采用 MIT、BSD 和 Apache 2.0 等宽松许可证,Mediabunny 采用 MPL 2.0,LAME MP3 编码器则以 LGPL 许可证作为一个独立的、可替换的文件提供。请查看库列表及其版本和许可证。
如何亲自验证没有上传任何东西
您不必只听我们的一面之词。有两个简单的测试:
- 断网测试。打开一个工具页面,先压缩一个文件让引擎加载,然后关闭 Wi-Fi 或移动数据,再压缩另一个同类型的文件。它照样能用,因为整个过程根本不需要网络。
- 观察网络。在 Chrome、Edge 或 Firefox 中按 F12,打开“网络”(Network)选项卡,然后压缩一个文件。您会看到压缩程序代码从我们的网站加载,还有统计分析和广告的请求,但没有任何携带您文件的请求。一张 10 MB 的照片如果被上传,会显示为 10 MB 的上传请求;但这样的请求并不存在。
页面确实会向 Google Analytics 发送匿名的使用事件,例如“压缩了一个几 MB 的 JPG”。这些事件包含所用工具、文件类型,以及大小、节省量和处理时间的大致区间,绝不包含文件名或文件内容。
无损压缩:内容相同,字节更少
无损压缩会找出冗余,也就是重复存储或可以预测的内容,并以更紧凑的方式写入。解码时会精确地逆转这个过程。几乎所有无损格式都用到以下三个思路:
- 预测。图像中相邻的像素或音频中连续的采样通常很相似。不存储完整的值,而是存储与预测值之间的小差值,留下的数字大多接近于零。PNG 滤波器和 FLAC 的线性预测器就是这样工作的。
- 重复。重复出现的序列会被替换为指向前面那份副本的简短引用。这是 DEFLATE 中的 LZ77 部分,ZIP、PNG 和 Office 文件都在使用。
- 熵编码。常见的值用短编码,罕见的值用长编码(哈夫曼编码或算术编码)。
无损压缩有一个天然的极限:随机噪声无法预测,所以颗粒感强的照片或噪声大的录音,不损失信息就永远缩小不了多少。这也是为什么压缩已经压缩过的文件(例如把 JPEG 放进 ZIP)几乎省不了任何空间。
有损压缩:去掉您不会在意的部分
有损编解码器更进一步,会丢弃人眼和人耳几乎察觉不到的信息。JPEG 和 WebP 以低于亮度的分辨率存储色彩,并把细微的高频细节舍入掉。MP3、AAC 和 Opus 会丢弃被更响的声音掩盖的声音。H.264 等视频编解码器每隔一段时间存储一张完整画面,中间则主要存储运动和变化。
质量或码率设置决定了丢弃多少信息。在适中的设置下,损失很难察觉;压得太狠,就会出现典型的瑕疵:图像中的方块和光晕,音频中的金属声或水下声,快速运动的视频画面中的拖影。
工具承诺什么,不承诺什么
- 您永远不会得到一个更大的文件。如果结果没有变小,工具会返回原文件,并告诉您它已经是最优的。
- 对于同一个文件和相同的设置,文档和音频文件每次都会得到完全相同的字节;硬件视频编码器每次运行的结果可能相差几个字节。
- 文档中的文字仍然是文字;页面永远不会被转换成图片。
- GPS 位置等图片元数据默认会被删除,而色彩配置文件和旋转方向会保留。位置、设备、日期等视频元数据也默认删除;音频则会保留标签和封面,除非您关闭此项。
我们无法承诺某个具体的百分比。节省多少完全取决于文件是如何生成的:手机照片或扫描版 PDF 通常有很大空间,已经优化过的文件则空间很小。工具会为每个文件显示精确的压缩前后大小。
在浏览器中压缩的局限
浏览器标签页是一个内存有限的沙箱,这决定了哪些事情是可行的。在电脑上,工具可接受最大 200 MB、1 亿像素的图片,最大 300 MB 的 PDF 和 Office 文件,以及最大 4 GB 的视频和音频(手机上为 1 GB),不过较长的 4K 视频仍可能超出标签页的内存。速度取决于您的硬件:在我们于一台高速 Windows 电脑上用 Chrome 进行的测试中,一分钟 1080p 视频约需 20 秒,一张 2400 万像素的照片约需 2.5 秒;手机可能要慢得多。视频和大多数音频转换需要 WebCodecs,最新版的 Chrome、Edge、Opera,以及 Firefox 130+ 和 Safari 26+ 都提供这一接口;即使没有它,WAV 和 AIFF 也能转为 MP3、FLAC 或 WAV。
有几种格式在浏览器中根本没有解码器,例如 WMA、AVI 和 WMV;旧的二进制 Office 文件也无法被安全地重写。对于这些格式,工具会说明可行的方案,而不是生成一个可能损坏的文件。当一项任务对浏览器来说过于繁重时,诚实的建议是使用桌面程序,例如处理视频用 HandBrake,处理文档用 LibreOffice。