【发布时间】:2013-03-18 11:31:36
【问题描述】:
这个问题可能是一个“未决问题”,你们中的许多人可能急于结束它,但请不要。让我解释一下。
众所周知,JPEG 有两种压缩方式(至少在 Photoshop 保存对话框中)
- 优化,图像加载有点像逐行
- 渐进式,首先加载图像的地方像马赛克一样,逐渐变好直到原始分辨率
我之前读过很多 PNG/JPEG 优化articles,但现在我遇到了这种很棒的第三种压缩,来自一个狂野的随机谷歌图片搜索。有问题的JPEG是这个
http://storage.googleapis.com/marc-pres/boston-event-1012/images/google-data-center.jpg
尝试在 Chrome/Firefox 中加载链接(仅在 IE/Safari 中,直到图像完全加载然后显示)
你可以观察:
- 图片首先以黑白方式加载
- 然后看起来像 Red 频道已加载
- 在加载的绿色频道旁边
- 最后一次加载蓝色频道
我尝试使用模拟的非常慢的连接再次加载它,并观察到 JPEG 不仅按通道顺序加载,而且还以渐进方式加载。所以首先加载的图像是黑白马赛克然后是绿色马赛克然后逐渐全彩色马赛克最后是全分辨率和全彩色图像。
这是一项了不起的技术,假设您正在构建一个电子杂志,其中每个页面都有很多图片,您希望用户快速翻阅页面,而这种图片正是最有效的。为了快速预览,加载blank-n-white缩略图,如果用户停留,则完全加载原始图像。
所以我的问题是:如何使用 Python Pillow 或 ImageMagick 或任何类型的开源软件生成这样的图像?
如果您认为这个问题不合适,请发表评论,不要直接关闭它。
更新 1:
事实证明,Google 在其所有 JPEG 图片1、2 中都使用了这项技术,例如this
更新2:我找到了另一个clue
【问题讨论】:
-
听起来就像是渐进式图像,而不是第三种类型的 JPEG。渐进式 JPEG 图像包含多个“扫描”。每次扫描通常包含 MCU 的更详细的信息(AC 系数)。没有什么可以阻止您一次为每个单独的通道 (Luma / Cr / Cb) 填充每个扫描的信息。
-
为了了解 JPEG 的不同编码方式,可以阅读 ITU T.81 document (made available online courtesy of w3.org),并阅读 SOF(帧开始)和 SOS(扫描开始)标记。特别是,SOF 必须指定组件(颜色通道)的总数,而 SOS 可以指定它们的任何子集。 JPEG 图像可以包含多个 SOS(扫描)。忽略除第一次扫描之外的所有内容是一个常见的 JPEG 解码器实现错误。
标签: image-processing imagemagick jpeg python-imaging-library image-compression