把一张高清照片扔进电脑,硬盘瞬间就爆掉了一大半,但这玩意儿实际上是个特别高明的“偷懒”法子。想象一下,你手里拿着一张超大张的画,这画相当复杂,上面有无数种纹理,有光影,有颜色。

要是你直接存下来,硬盘得按这张画的体积来算,略微大些的图,容量都得占上几兆,就连几十兆。

这时候,咱们就得干点不靠谱但挺实用的活了——压缩它。 压缩啥?说白了,就是让图片看起来跟原图没啥区别,但文件变小了。它是个像魔术师一样的过程,主要靠三个主要角色:一个把图片打散重组,一个负责修补填充颜色,还有一个专门负责偷懒的“偷懒者”。最核心的,就是那些把黑色变白的智慧家伙。 你看那些水印,有时候是黑色的,有时候是白色的,要么颜色发灰。

这些像素点在大屏上看可能简直看不见,但算法得把它们填进去。为了填这些空白,算法就得知道周围的纹理是怎么着的,然后顺着纹理去填充。

这就好比你在画布上泼了颜料,旁边有一块空白,算法得猜那块空白里该是啥颜色的颜料,然后涂上去,尽量跟周围融为一体。

要是猜对了,画面就顺;猜错了,可能局部就有肉眼由此可见的色块。 再说说那些黑白色的水印,它们如何变得像颜色一样?算法会让原本只有黑色像素的地方变成一点白色,要么一点点灰色,让它看起来像是确实有了颜色。

不过这个操作有个限制,就是不能瞎改。它得严格遵守原图的结构。

比如原图里,眼周围本来就有淡淡的阴影,算法在填眼白的时候,就不能把眼周围的黑全变白,否则眼就瞎了。它是把黑色变灰,而不是把黑色变白。

这种处理方式,让水印看起来像是从原图里“生长”出来的,而不是贴上去的。 还有一个关键概念叫“块”,中文叫“luma block"。

你想想,一张图里,是不是大局部区域实际上是暗的,也就是黑色和深灰色?要是把这些一起压缩,效率会高大量。大局部地方是黑的,也大局部是白的,中间的过渡处是灰的。算法会把整张图切分成一个个小方块,每个方块就是一个单位。 比如你有一张照片,大局部是黑的,可是有一点点亮色。算法会把这整个照片切成大量个小块,每个块里都是黑灰的。

这时候它只需求去压缩这些黑灰块,而把亮色块单独处理,要么直接忽略。出于黑灰块的数量顶多,压缩它们的效率最高。亮色块别看颜色丰富,但数量少,专门做压缩就挺费资源。

故此,算法会把图片转换成两种样子:一种是大量的黑灰块,另一种是少量的亮色块。暗色块是主角,亮色块是配角。 咱们来看看具体数据。一张 1024 像素宽、768 像素高、质量 80% 的图片,原本会占用几十兆的存空间。但经过阈值处理算法压缩后,能瞬间缩成几兆。

比如一个例子,同样是这张图,原本的存量可能是 50MB,经过处理后压缩成了 8MB,差不多缩小了六分之一。压缩比也就是这样算出来的。 这里面有个挺有意思的现象叫“脑袋开销”。每压缩一张图,算法都得先花点力气重新张罗一下像素的信息结构,这就好比在文件里加个头,把原本凌乱的数据重新排列好。

这个头占用了不少空间,但要是不做这个头,数据就没法存了。

故此,压缩的过程实际上是“头变大,体变小”的平衡。 还有一种压缩手段叫“直方图均衡化”。

这也挺管用的,特别是对那些灰蒙蒙的照片,比如那种没好好曝光的黄昏,要么阴天拍出来的东西。直方图均衡化会让像素的亮度分布变得均匀,让暗部更暗,亮部更亮,进而增强对比度。但这操作有个副功能,就是可能会让原本清楚的脸变得不清楚,边缘形成水印状的数字痕迹,这就是所谓的“数码磨皮”。 再看动态范围。人眼看到的东西,大局部是暗的,只有眼和屏幕有少数像素是亮的。计算机里的图像颜色也是类似的,大局部是暗色,只有高光局部亮。为了节省存文件的空间,系统会假设亮部极少,只压缩亮部的数据,暗部的数据直接当“垃圾”存起来,别动,反正它们没用。

这就叫“尖峰压缩”,把亮部压缩成小块,暗部忽略。 再比如把图片分成两种格式,一种是“灰度图”,就是把颜色去掉,只看亮度的黑白图;另一种是“二值图”,就是只保留黑白两个状态,去掉所有中间灰度的像素。

这种二值图压缩率极高,但看久了眼会累。出于所有的像素都是非黑即白,没有过渡。并且二值图里的黑色一般是一整块,少了细节,看起来就不够精细。 还有“撇号压缩”,针对那些黑白对比特别强的边缘,比如黑衣服上的白色衣服,像素点都是死板的黑和死板的白。算法会给这种边缘加一个“撇号”符号,把相邻的黑白块连起来,让它们看起来像是一体的。

这样压缩后,数据量能再省下一半,看的时候能感觉到边缘变柔和了,削减了那种生硬的数字感。 这种方式别看省电,但有个缺点,就是边缘在某些地方会显得生硬,细节不够丰富。 最终是“纹理压缩”,针对那些有细节的地方,算法会跳过那些纹理细节,只保留大块的纹理特征,把具体的图案信息舍弃掉。

这样文件就能变得贼小,可是图案会变得不清楚,不再是原来的样子了。 故此,压缩到底是如何做到的?它不是把图片当成一堆数字乱搞,而是根据原图的强弱、明暗结构,选性地压缩那些关键的地方。暗部不管它,亮部优先压缩

与此同时,它还处理那些黑白水印,把它们伪装成颜色,要么让它们看起来像是从原图里长出来的。

最终,通过把图片切成小块,运用各种算法,把数据量压缩到极致,与此同时保留肉眼简直看不见的痕迹。 这个过程就像是在打包文件,把需求看的局部打包起来,把看不见的局部扔进垃圾桶,与此同时给那些必要的局部加上一点“伪装”,让它们看起来像是自然生成的,而不是被强行压缩的。

这也是为啥我们既能存下几百兆的原创高清照片,又能用手机快速存下几张几十兆的压缩图的缘由。