JPEG - 思想与实践/指南和实现
T.81 建议以有关实现算术编码和分层过程所需专利的列表作为结尾(这可能是这些方法没有更广泛传播的原因),以及一个参考文献列表。但在这些附录之前,有一个名为“示例和指南”的附录(“不构成本建议/国际标准的组成部分”)。在这个附录中,您可以找到上面显示的量化表和我们在(真正的)JPEG 程序中显示和使用的霍夫曼表。关于量化表,它说:“这些基于心理视觉阈值,并使用亮度和色度以及 2:1 水平子采样以经验方式得出。这些表仅作为示例提供,不一定适合任何特定应用。这些量化值已在 8 位每样本亮度和色度图像上取得良好的效果”。霍夫曼表“是根据大量 8 位精度的图像的平均统计数据开发的”。附录还包括用于生成指定霍夫曼码表的列表的程序,即:1)上面提到的基于频率构建霍夫曼树的程序,以及如何从树中找到码长并计算每个码长的码数以获得 BITS 列表(以及可能修改此列表,使其从 1 到 16);以及 2)根据码长对霍夫曼值进行排序以获得 HUFFVAL 列表的程序。因为我们假设我们已经导入了这些列表,所以我们这里不会详细介绍这些过程——我们将在附录 2 中展示这些程序。
颜色空间指定,在我们的例子中是从 RGB 三元组到 YCbCr 三元组的转换(通过第一部分 中显示的线性转换 RGB → YCbCr),在 T.81 中根本没有提到。像这样的东西属于 JPEG 方法的具体实现,并且使用的实现是在一个或多个 APP 段中指定的。有两种类型的实现:交换格式,其中所有必要的表都包含在文件中,以及缩写格式,其中一些表(可能是全部)丢失,因为应用程序提供它们(可能通过用于表规范的缩写格式安装,这是一个没有颜色数据的 JPEG 文件)。
这里我们应用在 APP0 段中指定的交换格式,该段在说明段长度的(0,16)对之后具有这些字节
- 标识符 (= JFIF):五个字节 74、70、73、70 和 0,构成字符串“jfif#”
- 版本(对):在我们的例子中是(1,2)
- 单位(字节):0
- Xdensity(对):(0,1)
- Ydensity(对):(0,1)
- Xthumbnail(字节):0
- Ythumbnail(字节):0
Xdensity 和 Ydensity 分别是水平和垂直像素密度,以每英寸点数(单位 = 1)或每厘米点数(单位 = 2)测量。我们选择了 X = 1 和 Y = 1,并且没有单位(单位 = 0),这意味着没有这样的默认打印信息。Xthumbnail 和 Ythumbnail 分别是缩略图的宽度和高度。我们将这些数字设置为 0,这意味着这样的图片没有存储在标题中。在相反的情况下,此(例如 RGB 值)数据必须存储在上面的字节之后,或在紧随此 APP 段之后的 APP 段中。
如果没有 APP 段,您将获得默认实现,这就是我们在这里使用的实现。此实现的描述可以在“JPEG 文件交换格式/版本 1.02”(1992)中找到。没有默认的量化表和霍夫曼表。如果其中一些丢失,则一定是使用了缩写格式,并且这些表必须出现在打开文件的程序中并在 APP 段中引用。