从零开始手敲次世代游戏引擎(JPEG特别篇)-3

从零开始手敲次世代游戏引擎(JPEG特别篇)-2我们写了一个最基本的JPEG文件解码器。当中采用的例子是一个只有白黑两种颜色的16×8像素的图片。
如果我们采用更为复杂的图片,会不会有什么问题呢?
接下来我们可以来进行这方面的确认。
首先我们使用GIMP这个开源的图像编辑软件创建一幅稍微复杂的,带有红黄蓝绿4个颜色的16×16的JPEG文件,如下:
在保存(Export)的时候,GIMP 会提示如下一些选项:(需要展开Advanced Options)
首先让我们尝试去掉所有的复选框的勾选。然后点击Export。这时候执行我们所写的解码器,最后输出的结果如下:
可以看到基本上没有什么问题,但是红色色块的部分R的值不是FF,而是FE;绿色色块的部分G的值虽然是FF但是B通道出现了个1;而蓝色色块的部分与红色色块的部分类似FF编变成了FE;至于黄色的色块,我们设定的颜色是FF E3 08但是还原出来的是FF E2 08。
由于这个误差出现的情况在蓝色和红色色块类似,而在绿色和黄色色块出现的情况不同,我们可以推测它是与颜色相关的阶段发生的误差,而不是诸如DCT等各个通道均等处理阶段发生的误差,更不应该是在Quantization阶段因为舍弃了部分绝对值较小的高频信号导致的。我们可以立即验证这一点:
我们当前的Quantization矩阵是
重新回到GIMP,将Quality从原来的90调节到100,其它保持不变:
我们会发现Quantization矩阵变成了下面这个样子:
也就是不对DCT矩阵进行任何缩放。这就会导致所有绝对值大于(0.5)的AC分量都被按原样保留,但是最终还原的RGB数据仍然是一样的。
所以,到这里我们至少有两个收获:
  1. 在导出JPEG时设置的品质参数Q,实际上是控制着Qunatization矩阵的内容。Q设置得越高,Quantization矩阵当中的值就越大,DCT矩阵按元素与Quantization矩阵相除并取整之后得到的0⃣️就越多,压缩率就越大,但是也意味的越多的高频信号被丢弃,图像的锐度(细节)丢失得越多;
  2. 在色空间变换的时候,会产生颜色的轻微改变。
这些知识对于游戏开发的时候的(特别是美术同学)的提示至少是,
  1. 首先,对于需要严格指定颜色的情况,不要使用JPEG格式导出贴图;
  2. JPEG格式更加适合实拍的贴图,而不适合手绘的贴图;
  3. 设置比较高的Q参数可以得到比较好的细节,但是这对于矫正和原图的色差没有什么帮助。
然后我们来看导出选项当中的Optimization选项。在☑️这个选项之前,我们得到的密码本是和上一篇差不多的那一长串。在☑️之后,密码本如下:
是的,你没看错,这就是全部4个密码本。是不是比上一篇单个密码本还小?
所以☑️这个选项的用途就是,缩小密码本的大小。在密码本当中只包括实际用到的值,而去掉那些没有用到的值。而且,索引也是经过优化的,变得更短了。(因为值少了,我们可以用更短的学号(索引))
所以这里学到的是:
  1. ☑️Optimization选项可以减小导出的JPEG文件的大小,并且不会对还原出来的图片质量造成任何损失。
好了。关于JPEG的导入这里就暂告一个段落了。

发表评论

Fill in your details below or click an icon to log in:

WordPress.com 徽标

您正在使用您的 WordPress.com 账号评论。 登出 /  更改 )

Google photo

您正在使用您的 Google 账号评论。 登出 /  更改 )

Twitter picture

您正在使用您的 Twitter 账号评论。 登出 /  更改 )

Facebook photo

您正在使用您的 Facebook 账号评论。 登出 /  更改 )

Connecting to %s

%d 博主赞过: