渐进式 jpeg 与基线 jpeg

Progressive jpeg vs baseline jpegs

我有一个网络画廊,我在其中显示用户上传的文件大小和分辨率各不相同的图像。目前所有图像都是基线。所以我想知道如果我将它们转换为逐行图像是否真的会产生重大影响。使用渐进式图像的优点和缺点是什么。

唯一的区别是渐进式图像的编码方式允许浏览器在图像仍在下载时显示图像的粗略预览,这在 progressively 中变得更好质量,直到最后下载完成。基线图像将从上到下加载,渐进式图像将从低分辨率加载到高分辨率。

对于不支持渐进式图像的浏览器,在加载整个图像之前您将看不到任何东西。 (现在所有半现代浏览器都支持渐进式 JPEG。)

您可以看到动作差异的动画,例如这里:https://www.youtube.com/watch?v=TOc15-2apY0

JPEG 标准定义了多种压缩模式。其中只有三个被广泛使用:

  • 基线顺序
  • 扩展顺序
  • 渐进式

第一个中的唯一区别在于允许的表数。否则,它们的编码和解码方式完全相同。

JPEG 将图像分成帧,然后再分成扫描。以上模式只允许一帧。框架是图像。扫描通过图像数据。扫描可能包含一种颜色分量的数据,也可能交错并包含多种颜色分量的数据。

  • 灰度顺序 JPEG 流将扫描一次。
  • 彩色连续 JPEG 流可能有一次或三次扫描。

JPEG 采用 8x8 像素数据块并将离散余弦变换应用于该数据。 64 个像素数据变成 64 个 DCT 系数。第一个 DCT 系数称为 "DC" 系数,其他 63 个称为 "AC" 系数。

这是一个令人困惑的术语,它借鉴了直流和交流电流的类比。 DC系数类似于块的平均像素值。

在顺序 JPEG 中,块中的 64 个系数一起编码(DC 和 AC 系数编码不同)。在 Progressive JPEG 中,DC 和 AC 系数扫描对系数内的位域(大小可配置)进行编码。理论上,您可以对每个组件的每个位进行单独扫描。

渐进式 JPEG 的实现和使用要复杂得多。如果您正在为顺序 JPEG 创建编码器,您只需要让调用者选择使用交错或非交错扫描。对于渐进式 JPEG,您的编码器需要一种机制供调用者确定扫描次数以及每次扫描应编码哪些位。

渐进式编码可能比顺序编码慢,因为您必须对数据进行多次传递。

渐进式解码的速度问题取决于它是如何完成的。如果您一次解码整个图像,则渐进式解码可能比连续解码稍微慢一些。如果您的解码器在处理流时显示图像淡入,它将比顺序慢得多。每次更新显示,都要做逆DCT、上采样、颜色变换。

另一方面,使用经过良好调整的扫描的渐进式 JPEG 可以获得更好的压缩效果。

progressive 和 sequential 在质量上没有区别

本书描述了过程:

https://www.amazon.com/Compressed-Image-File-Formats-JPEG/dp/0201604434/ref=asap_bc?ie=UTF8