JPEG - 想法与实践/解码与绘制
外观
从文件中绘制图像的程序必须以相反的顺序执行我们已经完成的所有操作。图像的宽度和高度以及质量因子必须从标题中读取。
让我们总结一下在构建文件数据部分时必须执行的操作
- 将图像划分为 sxs 方块
- 对于每个方块
- 对于每个点,将 RGB 值转换为 YCbCr 值
- 对于 Y、Cb 和 Cr 分量,对 s2 个数字进行余弦变换
- 按照之字形原则对这 3 x s2 个数字进行排序
- 用从前一个方块的模拟数字推导出的值替换 s2 序列的第一个数字(DC 项)
- 对 3 x s2 个数字进行量化
- 在生成的整数序列中,用其长度(可能为 0)替换每个连续的零序列
- 将每个整数写为比特序列(包含两部分:代码和数字表达式),以便这些序列可以连接在一起形成连续的比特流。
在读取标题(声明宽度、高度和质量因子)后,我们必须将文件中读取的每个字节转换为 8 位块,然后解码生成的比特流。确定每个整数的比特序列包含两部分。第一部分形成一个代码,该代码的设计使得我们可以看到它的结束位置。我们对其进行解码,并以此方式获得一个自然数 m。序列的第二部分是流中的接下来的 m 个比特,而这 m 个比特是整数的二进制数字表达式。但是,如果此序列以 0 开头,则表示该整数为负数,并且必须将 0 替换为 1。每个第二个整数(为非负数)表示零的个数,我们(想象我们)写下这些零。我们这样做直到我们有足够的数字来绘制图像的 sxs 方块,即 3 x s2 个数字。这 3 x s2 个数字是通过对三个分量的 s2 个颜色值进行余弦变换和量化而获得的。首先,它们必须通过乘以我们除以的数字来去量化。在此之后,每个 s2 序列的第一个数字(DC 项)必须加到前一个 sxs 方块的对应数字,因为这些数字表示差异。通过逆之字形过程,每个三个 s2 序列被转换为一个 sxs 数字矩阵 g(u, v),u, v = 0, 1, ..., s-1,并将逆余弦变换应用于此矩阵,从而得到一个矩阵 f(i, j),i, j = 0, 1, ...,s-1,该矩阵包含 Y、Cb 和 Cr 分量的颜色值。对于 sxs 方块中的每个点 (i, j),三个颜色值 f(i, j) 构成一个 YCbCr 三元组,该三元组被转换为一个 RGB 三元组,并且图像中对应于方块中点 (i, j) 的点用这些 RGB 值着色。