【译】重要的图像优化之四:“素人”JPEG下

注明:本人原创翻译,原版为Essential Image Optimization电子书,这里将其拆分为几篇文章发布。另外,文中部分链接可能会因为“网络”原因无法打开。不必着急,我会慢慢将其中一些比较好的内容翻译过来发表,都会在这个“Web图像技术深究”专题中。

目录

正文:

JPEG的压缩模式(接上文

使用JPEG优化编码器

现代化的JPEG编码器会尝试生产出更小更高保真的JPEG文件,同时保持与现有浏览器以及图像处理应用程序的兼容性。它们避免了在运行的系统中引入新的图像格式而带来一系列变化,并给图像优化压缩带来质的变化。这里就有两个这样的编码器,它们是MozJPEG和Guetzli。

简单聊一下:你该使用哪个编码器?

  • 一般使用MozJPEG
  • 如果你的核心关注点是图像质量,而且不在乎相对较长的编码时间,则使用Guetzli
  • 如果你需要更好的可配置性:
  • JPEGRecompress (底层使用了MozJPEG)
  • JPEGMini:它类似于Guetzli会自动选择最佳质量。但它不如Guetzli技术复杂,而且更快,其目标是在于更适用于网络的最佳质量图像。
  • ImageOptim API这里还有个免费的在线界面):它的颜色处理机制是独一无二的,您可以分开选择颜色质量与整体质量。另外,它可以自动选择色度抽样级别,以便在屏幕截图中保留高分辨率颜色,并避免了在自然照片中平滑色彩的字节浪费。

什么是MozJPEG?

MozJPEG是Mozilla开源提供的现代化的JPEG编码器。它声称要去除JPEG文件的10%左右的体积。使用MozJPEG压缩的JPEG文件可以跨浏览器显示,并且还包括渐进式扫描优化、网格量化(丢弃最少压缩的细节)以及一些优秀的量化预设等功能,可以帮助创建更平滑的高分辨率图像(当然也可以使用ImageMagick,如果你愿意去浏览XML配置)。

MozJPEG不仅被ImageOptim所支持,并且还有一个可靠的可配置imagemin插件。以下是Gulp的简单实现示例:

const gulp = require('gulp');
const imagemin = require('gulp-imagemin');
const imageminMozjpeg = require('imagemin-mozjpeg');

gulp.task('mozjpeg', () =>
    gulp.src('src/*.jpg')
    .pipe(imagemin([imageminMozjpeg({
        quality: 85
    })]))
    .pipe(gulp.dest('dist'))
);
Modern-Image10.jpg
image.png

MozJPEG:不同质量的文件体积与视觉相似度得分的比较。

我用来自jpeg-archive项目的jpeg-recompress来计算一个源图像的SSIM(结构相似性)分数。SSIM是一种用于测量两个图像之间的相似性的方法,其中的分数就是一个图像对比另一个图像的“完美”相似测量值。

根据我的测量结果,MozJPEG的确是一个很好的选择,它可以保持高视觉质量来压缩网页的图像,同时减少文件的大小。对于中小型图像,我发现MozJPEG(质量= 80-85)可以将文件大小减少30-40%,同时保持可接受的SSIM,在jpeg-turbo库上可以提高了5-6%读取速度。MozJPEG确实要比基线JPEG编码更慢,但这不足以成为你放弃它的理由。

注意:如果您需要一个支持MozjPEG的工具,并包含配置支持,以及一些免费的图像比较实用程序,请查看jpeg-recompress。《Web Performance in Action》的作者Jeremy Wagner提供了一种参考配置,如下:jpeg-recompress --min 35 --max 70 --strip --method smallfry --loops 16 in.jpg out.jpg

什么是Guetzli?

Guetzli是一个来自谷歌的、有前景的、有些缓慢的感知型的JPEG编码器,它会试图找到一个人眼在视觉上无法区分差异但却体积最小的JPEG文件。Guetzli会执行一系列感知测试,为最终的JPEG提出方案,并对每个方案进行评估。最终在其中选择最高评分的提案作为最终输出。

而为了测量图像之间的差异,Guetzli使用Butteraugli,一种基于人类感知来测量图像差异的模型(下面会介绍)。Guetzli可以考虑到其他JPEG编码器没有的几个视觉属性。例如,人眼所看到的绿光量与蓝色的敏感度之间是存在关系的,因此绿色旁边的蓝色信息的编码就会动态修改的更精准一些。

注意: 图片文件的大小更多取决于你图片的质量,而非使用的编解码器。与通过切换编解码器实现的文件大小节省相比,最低质量和最高质量JPEG之间的文件大小差异要更大的多。因此,设置最低可接受的质量非常重要。避免将您的质量设置得太高,并且不去关注它。

Guetzli 声称当在Butteraugli得到同样的质量评分的情况下,和其他编码器相比可以将数据体积再减小20-30%。使用Guetzli的一个大问题就是,它非常非常慢,目前只适用于静态内容的优化。从它的说明中可以看出,Guetzli需要大量的内存(每百万像素可能需要1分钟+ 200MB的内存)。这里有一个很好的Guetzli实践测试报告。可以看到,Guetzli可以作为你的静态网站构建过程中图片优化的理想拼图,但是在按需执行时就并不合适了。

注意:当您将图像优化作为静态网站的构建过程的一部分时,Guetzli可能更加适用,或者在不需要按照要求执行图像优化的情况时。

像ImageOptim这样的工具,同样支持Guetzli优化(在最新版本中)。

const gulp = require('gulp');
const imagemin = require('gulp-imagemin');
const imageminGuetzli = require('imagemin-guetzli');

gulp.task('guetzli', () =>
    gulp.src('src/*.jpg')
    .pipe(imagemin([
        imageminGuetzli({
            quality: 85
        })
    ]))
    .pipe(gulp.dest('dist'))

);
Modern-Image12.jpg

可以看到,为了节省些空间,使用Guetzli编码一张3 x 3MP的图像要花费近七分钟的时间(并且伴随着高CPU使用率)。但是为了存档更高分辨率的照片,我认为付出些代价也是值得的。

Modern-Image13.jpg

Guetzli:不同质量的文件体积和视觉相似度得分的比较。

注意:建议在高质量图像(例如未压缩的图像,PNG原图或者100%质量(或无损)的JPEG)上使用Guetzli。虽然它可以在其他质量的图像(例如质量为84或更低的JPEG)上工作,但结果可能较差。

使用Guetzli压缩图像是非常(非常)耗时的,可能会使你的用户转身而去,但是对于较大的图像,这是值得的。我已经可以看到一些使用案例里,Guetzli可以仅仅保留文件大小的40%,同时保持了视觉的保真度。这使它非常适合存档照片。在小到中等大小的图像上,我仍然看到一些地方在应用(在10-15KB的范围内),但是效果并不显著。Guetzli可以在压缩更小的图像上引入更多的液化曲线失真。

您可能还对Eric Portis的这项研究感兴趣,他将Guetzli与Cloudinary的自动压缩功能进行了比较,并从中获得了一些有效的不同数据点。

MozJPEG与Guetzli孰优孰劣?

比较不同的JPEG编码器是很复杂的 —— 它需要比较压缩图像的质量、保真度以及最终文件大小等多项内容。正如图像压缩专家KornelLesiński指出的那样,仅就单方面而非多个角度进行测试比较,很可能会导致一个无效的结论。

那Guetzli和MozJPEG比究竟如何呢?—— Kornel指出:

  • Guetzli更适用于更高品质的图像(butteraugli建议最好是q=90以上,而MozJPEG更适宜处理q=75左右的图像)
  • Guetzli压缩速度要慢得多(都是生成了标准的JPEG,所以解码速度是一样很快的)
  • MozJPEG不会自动选择质量设置,但您可以使用外部工具找到最佳质量,例如jpeg-archive

存在多种方法,都可以用于测定压缩图像与原图像的相似度或视觉感知差异度。一些图像质量研究经常会使用像SSIM(结构相似性)这样的方法。然而,Guetzli则是通过优化Butteraugli的方法来实现的。

Butteraugli

Butteraugli是一个来自Google的项目,它可以估算一个人可能会注意到两个图像的视觉降级(即心理视觉相似性)的点,并给出几乎没有区别的两个图像的比对分数。Butteraugli不仅给出一个标量的分数,而且还会计算出图像差异水平的空间图。所以当SSIM专注于计算图像中差异的总和时,Butteraugli则更专注于差异最明显的部分。

Modern-Image14.jpg

上图是一个例子:使用Butteraugli找到用户无法注意到视觉差异的最小质量阈值。并且缩小了65%的文件体积。

在真正的实施中,您将会制定一个图像质量的目标,然后运行一些不同的图像优化策略,查看您的Butteraugli分数,然后再找到合适的文件大小与质量级别的最佳平衡点。

Modern-Image15.jpg

总而言之,我花费了30分钟来安装Butteraugli到我的Mac上,包括安装Bazel和编译C++的源码。使用它就非常简单了:选择两个图片(一个原图和一个压缩版本)进行比较,它就会给你一个比较分数。

Butteraugli与其他视觉相似度比较算法有什么不同?

[根据一位Guetzli项目成员的这条评论表明,Guetzli在Butteraugli得分最高,但在SSIM和MozJPEG得分也最差。其实,这是符合我自己对图像优化策略的研究的。我会运行Butteraugli和一个Node模块(如img-ssim)比较在使用了Guetzli、MozJPEG的之前和之后,源图像和压缩图像的SSIM分数。

组合编码器?

对于一些较大的图像,我发现将Guetzli与MozJPEG中的无损压缩(jpegtran,而不是cjpeg,避免丢掉了Guetzli完成的工作)结合起来使用,可以将文件大小再减少10~15%(总体55%),并且只有非常小的SSIM评分损失。我只是提醒一下可以在组合使用编码器方面进行一些试验和分析,但是也受到了Ariya Hidayat等业内其他人的好评

总结来说,MozJPEG是一个初学者友好的网页资源编码器,速度相对较快,可以生成高质量的图像。而Guetzli则是一个资源密集型的编码器,它在较大、更高质量的图像上效果最好,是我建议给中高级用户的一个好选择。

下一篇:【译】重要的图像优化之五:什么是WebP?

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,324评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,356评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,328评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,147评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,160评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,115评论 1 296
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,025评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,867评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,307评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,528评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,688评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,409评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,001评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,657评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,811评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,685评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,573评论 2 353

推荐阅读更多精彩内容