3

我正在开发一个 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 块
  • 和结束图像
4

0 回答 0