除了标准/渐进式,JPEG压缩的第三种类型:按通道加载?

12

这个问题可能是一个“开放性问题”,你们中的许多人可能急于解决它,但请不要这样做。让我解释一下。

众所周知,JPEG有两种压缩方式(至少在Photoshop保存对话框中)

  • 优化,其中图像加载类似于逐行加载
  • 渐进式,其中图像首先以马赛克状加载,然后逐步变得更好,直到原始分辨率

我之前阅读过很多关于PNG/JPEG优化的文章,但现在我在通过Google随机搜索图片时遇到了这种令人惊叹的第三种压缩方式。所涉及的JPEG如下:

http://storage.googleapis.com/marc-pres/boston-event-1012/images/google-data-center.jpg

请在Chrome / Firefox中尝试加载链接(在IE / Safari中,仅当图像完全加载并显示后才能加载)

您可以观察到:

  1. 图像首先以黑白方式加载
  2. 然后看起来是红色通道已加载
  3. 接下来加载绿色通道
  4. 最后加载蓝色通道

我尝试使用模拟的非常慢的连接再次加载它,并观察到JPEG不仅按通道顺序加载,而且还以渐进的方式加载。因此,首先加载的图像是空白和白色马赛克,然后是绿色马赛克,然后逐渐变为全彩色马赛克,最后是完全分辨率和全彩色图像。

这是惊人的技术,假设您正在建立一本电子杂志,每个页面都有很多图片,您希望用户快速翻页浏览,这种图像正是最好的工具。对于快速预览,请加载空白的缩略图,如果用户停留,则完全加载原始图像。

那么我的问题是:我该如何使用Python Pillow或ImageMagick或任何种类的开源软件生成这样的图像?

如果您认为此问题不合适,请发表评论,而不要将其关闭。

更新1:

事实证明,Google在所有的JPEG图片12(例如this)中都使用了这项技术。

更新2:我找到了另一个clue


3
这听起来就像是渐进式图像,而不是第三种类型的JPEG图像。渐进式JPEG图像包含多个“扫描”。每个扫描通常包含越来越详细的信息(AC系数)以供MCU使用。没有什么阻止您逐个通道(亮度/ Cr / Cb)地填充每个扫描的信息。 - BitBank
1
为了了解JPEG可以编码的不同方式,可以阅读ITU T.81文档(由w3.org提供在线),并了解SOF(帧开始)和SOS(扫描开始)标记。特别是,SOF必须指定组件的总数(颜色通道),而SOS可以指定其中任何子集。JPEG图像可以由多个SOS(扫描)组成。忽略除第一个扫描以外的所有扫描是常见的JPEG解码器实现错误。 - rwong
1个回答

8
在JPEG文件中,图像数据可以按多种方式切片,并且这些切片(通常称为“扫描”)可以以许多不同的顺序存储在文件中。
在大多数JPEG文件中,文件中的第一个扫描包括所有图像的颜色分量,如果是彩色图像,则交错在一起。在非渐进式JPEG中,文件将只包含该单个扫描。在渐进式JPEG中,将跟随其他扫描,每个扫描可能包含一个或多个分量。
但并没有必要这样做。如果文件中的第一个扫描未包含所有颜色分量,我们可以将此类文件称为“非交错”。
你的示例文件是非交错的,并且也是渐进式的。渐进式非交错的JPEG似乎比非渐进式非交错的JPEG得到更广泛的支持。
标准的IJG libjpeg软件能够创建非交错文件。虽然不是很容易,但您可以使用其实用程序,并使用文件中记录的选项。

1
我的一个朋友刚向我展示了这个命令:echo -e '0;\n1;\n2;' >script; cjpeg -scans script -outfile out.jpg in.ppm - est

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接