【问题标题】:Besides standard/progressive, the 3rd kind of JPEG compression: load by channel?除了标准/渐进式,第三种 JPEG 压缩:按通道加载?
【发布时间】: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 中,直到图像完全加载然后显示)

你可以观察:

  1. 图片首先以黑白方式加载
  2. 然后看起来像 Red 频道已加载
  3. 在加载的绿色频道旁边
  4. 最后一次加载蓝色频道

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

这是一项了不起的技术,假设您正在构建一个电子杂志,其中每个页面都有很多图片,您希望用户快速翻阅页面,而这种图片正是最有效的。为了快速预览,加载blank-n-white缩略图,如果用户停留,则完全加载原始图像。

所以我的问题是:如何使用 Python Pillow 或 ImageMagick 或任何类型的开源软件生成这样的图像?

如果您认为这个问题不合适,请发表评论,不要直接关闭它。

更新 1:

事实证明,Google 在其所有 JPEG 图片12 中都使用了这项技术,例如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


【解决方案1】:

JPEG 文件中的图像数据可以以多种不同的方式进行切片,切片(或通常称为“扫描”)可以以多种不同的顺序存储在文件中。

在大多数 JPEG 文件中,文件中的第一次扫描包含图像的所有颜色分量,如果是彩色图像,则交错在一起。在非渐进式 JPEG 中,文件将仅包含一次扫描。在渐进式 JPEG 中,随后会进行其他扫描,每个扫描可能包含一个或多个组件。

但没有什么需要这样做。如果文件中的第一次扫描不包含所有颜色分量,我们可以称这样的文件为“非交错”。

您的示例文件是非交错的,它们也是渐进式的。渐进式非交错 JPEG 似乎比非渐进式非交错 JPEG 得到更广泛的支持。

标准的 IJG libjpeg 软件能够创建非交错文件。虽然这并不容易,但您可以使用其cjpeg 实用程序,并在wizard.txt 文件中记录-scans 选项。

【讨论】:

  • 我的一个朋友刚刚给我看了这个echo -e '0;\n1;\n2;' >script; cjpeg -scans script -outfile out.jpg in.ppm
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-01
  • 1970-01-01
  • 2013-03-13
  • 1970-01-01
  • 1970-01-01
  • 2016-01-14
相关资源
最近更新 更多