Peo*_*Sea 9 c compression jpeg file-format image
我正在尝试使用C从头开始编写JPEG/JFIF编码器和解码器.我尝试编写一个示例JPEG文件,但似乎我无法使用MS paint,Firefox打开它.但我可以使用JPEGsnoop(http://www.impulseadventure.com/photo/jpeg-snoop.html?ver=1.5.2)和http://nothings.org/stb_image.c对其进行解码.我认为样本JPEG文件符合JPEG/JFIF标准,我不知道为什么像MS paint和Firefox这样的应用程序无法打开它.
以下是JPEG示例的样子:
SOI APP0 segment DQT segment (contains two quantization tables) COM segment SOF0 segment DHT segment (contains four Huffman tables) SOS segment huffman encoded data EOI
样本JPEG文件具有三个分量Y Cb Cr.没有Cb Cr组分的子采样.两个量化表都填充了一个.DHT细分市场中的四个霍夫曼表格完全相同,看起来像这样
[0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0] [0,1,2, ... , 254]
这意味着所有代码都是8位,因此霍夫曼编码并不真正压缩数据.
霍夫曼编码数据如下所示:
[0x0000(DC) 0x0000(AC)](Y) [0x0000(DC) 0x0000(AC)](Cb) [0x0000(DC) 0x0000(AC)](Cr) for all (i, j) MCUs except (10, 10) the data in (10, 10) MCU: [0x0008(DC) 0x0000(DC), 0x0000(AC)](Y) [0x0000(DC) 0x0000(AC)](Cb) [0x0000(DC) 0x0000(AC)](Cr)
谁能告诉我这个样本JPEG文件有什么问题?谢谢.
这是一个示例JPEG文件(ha.jpg)http://www.guoxiaoyong.net/ha.jpg的链接
几年前,我在一些 PNG 代码上遇到了类似的问题(尽管我不是从头开始编写的)。事实证明,我的代码比 Windows、某些浏览器等的库更符合标准。它们在典型情况下表现良好,但在不寻常和人为的图像上表现不佳,即使它们完全符合标准。一种常见的解决方法是对图像使用奇数像素宽度。我的测试套件中几乎有一半在 Windows 中无法查看。(这是很多版本之前的事了,比如 Windows 95。Windows 编解码器已经有了很大的改进。)
我最终构建了开源 PNG 库并将其用作我的参考实现。只要我的代码生成的图像可以被参考实现解析,反之亦然,我就认为它很好。我还检查了我的代码是否可以显示 Windows 可以显示的任何图像。每次我发现错误时,我都会在修复它之前将图像添加到我的测试套件中。这对于我的项目来说已经足够好了。
你也可以这样做。我相信有一个开源 JPEG 库被广泛用作参考实现。
如果您确实想弄清楚为什么 Firefox(或其他)无法打开您的图像,您可以尝试从在 Firefox 中打开的图像开始。逐步进行小的更改(例如,使用十六进制编辑器),使其更像失败的图像。这可能会帮助您缩小图像的哪些方面导致应用程序出错的范围。诚然,其中一些步骤可能很难尝试。