我正在开发一个 C++ 项目,在该项目中我必须以 JPEG 格式压缩位图数据,并将普通图像查看器可以打开的 .jpg 文件作为输出写入。我不能使用任何类型的库。
所有的 JPEG 压缩都完成了,我唯一缺少的是如何正确地在文件中写入内容。
我已经查看了 JFIF 格式文件规范,并搜索了很多,但无法弄清楚如何去做。
更详细地说,我应该在文件中正确放置所有标题,我真正想念的是,在我准备好编写 3 个颜色组件之后,我该怎么做?(按什么顺序编写组件,如何处理子采样组件(还有其他东西吗?))
编辑:
链接到示例输出图像(从随机生成的 8x8 RGB 位图开始)。
https://dl.dropbox.com/u/46024798/out.jpg
图像的标题(应该)指定这是一个 JPEG 8x8px,具有 3 个颜色分量,子采样率为 4:4:4。
更详细地说,我所做的是:
- 生成 3 个随机 8x8 块,值在 [0..255] 范围内
- 所有元素减去 128(现在在 [-128..127] 范围内)
- 将离散余烯变换应用于 3 个块
- 量化结果
- 将量化结果以之字形排列
- 在霍夫曼表中查找要写入文件的值(带有块结束标记之类的东西)
对于JPEG压缩,应该没问题。
然后我写文件:
- 首先,我编写 SOI 标头、APP0 标记、“魔术字符串”JFIF、版本、单位、密度和缩略图信息
- 那么量化表
- 然后是开始帧标记,具有图像精度、尺寸、组件数量、二次采样信息、DC Huffman 表和 AC Huffman 表
- 然后是 Start Of Scan 标题(可能是我搞砸的地方),在其中我指向 Huffman 表的 ID 以用于每个组件和其他我不知道确切含义的东西(光谱选择??,逐次逼近??)
- 最后,我按以下顺序编写霍夫曼编码值:
- 所有 Y 块
- 所有 Cb 块
- 所有 Cr 块
- 和结束图像