我试着用C语言从头开始编写JPEG/JFIF编码器和解码器。我试着编写了一个JPEG示例文件,但似乎我无法用Firefox的MS Paint打开它。但我可以用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公司
应用程序0段
dqt段(包含两个量化表)
COM段
SO00段
DHT段(包含四个哈夫曼表)
SoS段
哈夫曼编码数据
意向书
示例jpeg文件有三个分量y cb-cr。没有cb-cr分量的子采样。
这两个量化表都填了一个。
dht段中的四个huffman表都是相同的,如下所示
[0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0]
[0,1,2,…,254]
这意味着所有的代码都是8位的,所以哈夫曼编码并不能真正压缩数据。
哈夫曼编码的数据如下:
[0x0000(直流)0x0000(交流)](是)
[0x0000(直流)0x0000(交流)](断路器)
[0x0000(DC)0x0000(AC)](CR)用于除(10,10)以外的所有(I,J)MCU
(10,10)MCU中的数据:
[0x0008(直流)0x0000(直流),0x0000(交流)](Y)
[0x0000(直流)0x0000(交流)](断路器)
[0x0000(直流)0x0000(交流)](CR)
有人能告诉我这个JPEG文件的样本有什么问题吗?谢谢。
下面是指向示例jpeg文件(ha.jpg)的链接http://www.guoxiaoyong.net/ha.jpg
最佳答案
几年前,我在一些png代码上也遇到过类似的问题(尽管我不是从头开始写的)。结果发现,我的代码比windows和一些浏览器等的库更符合标准。它们在典型情况下表现良好,但在不寻常和人为的图像上窒息,即使它们完全符合标准。一个常见的绊倒他们的方法是使用奇数像素宽度的图像。我的测试套件几乎有一半在windows下不可见。(这是很多以前的版本,比如Windows95。Windows编解码器有了很大的改进。)
我最终建立了开源的png库,并将其用作我的参考实现。只要我的代码生成的图像可以被引用实现解析,反之亦然,我就称之为good。我还检查了我的代码是否可以显示windows可以显示的任何图像。每次我发现一个bug,我都会在修复之前将这个图像添加到我的测试套件中。这对我的项目来说已经足够好了。
你也可以这么做。我相信有一个开源的jpeg库被广泛用作参考实现。
如果你真的想弄清楚为什么firefox(或者其他什么)不能打开你的图片,你可以试着从一个在firefox中打开的图片开始。增量地进行小的更改(例如,使用十六进制编辑器),使其更像失败的图像。这可能有助于缩小图像的哪个方面会使应用程序出错。诚然,其中一些步骤可能很难尝试。