这个问题可能是一个“开放式问题”,很多人可能都渴望关闭它,但请不要 . 让我解释 .
众所周知,JPEG有两种压缩方式(至少在Photoshop保存对话框中)
-
已优化,其中图像加载类似于逐行
-
progressive,其中图像首先加载马赛克,逐渐变好直到原始分辨率
之前我已经阅读了很多PNG / JPEG优化articles,但现在我从一个狂野的随机Google Image搜索中遇到了这种令人敬畏的第三种压缩 . 有问题的JPEG就是这个
http://storage.googleapis.com/marc-pres/boston-event-1012/images/google-data-center.jpg
尝试在Chrome / Firefox中加载链接(仅在IE / Safari中,直到图像完全加载然后显示)
你可以观察到:
首先以黑白方式加载
-
图像
-
然后看起来像 Red Channels 加载
-
下一个 Green Channels 已加载
-
最后加载 Blue Channels
我尝试使用模拟的非常慢的连接再次加载它,并观察到JPEG不仅按通道顺序加载,而且以渐进方式加载 . 因此,首先加载的图像是空白和白色马赛克然后绿色马赛克然后逐渐全彩色马赛克,最后是全分辨率和全彩色图像 .
这是一项了不起的技术,假设您正在构建一个电子杂志,每个页面都有很多图片,您希望用户快速翻阅浏览页面,这种图像正是最有效的 . 要进行快速预览,请加载blank-n-white缩略图,如果用户停留,则完全加载原始图像 .
所以我的问题是:我如何使用Python Pillow或ImageMagick或任何类型的 open source 软件生成这样的图像?
如果您认为这个问题不合适,请发表评论,不要只是关闭它 .
更新1:
事实证明,谷歌在其所有JPEG图片中使用了这项技术1,2,例如this
更新2:我发现了另一个clue
1 回答
JPEG文件中的图像数据可以以许多不同的方式切片,并且切片(或通常称为“扫描”)可以以许多不同的顺序存储在文件中 .
在大多数JPEG文件中,文件中的第一次扫描包含所有图像的颜色分量,如果是彩色图像则交错在一起 . 在非渐进式JPEG中,该文件仅包含该一次扫描 . 在渐进式JPEG中,将跟随其他扫描,每个扫描可包含一个组件或多个组件 .
但没有什么要求它以这种方式完成 . 如果文件中的第一次扫描不包含所有颜色分量,我们可能会将此类文件称为“非交错” .
您的示例文件是非交错的,它们也是渐进式的 . 渐进式非交错JPEG似乎比非渐进式非交错JPEG更受支持 .
标准的IJG libjpeg软件能够创建非交错文件 . 虽然这并不容易,但您可以使用
cjpeg
实用程序,并在wizard.txt
文件中记录-scans
选项 .