jpeg文件格式问题

时间:2011-07-21 13:48:43

标签: c image jpeg compression

我正在尝试使用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

的链接

3 个答案:

答案 0 :(得分:4)

几年前我遇到过类似的问题,有一些PNG代码(虽然我没有从头开始编写)。事实证明,我的代码比Windows,某些浏览器等的库更符合标准。他们在典型情况下做得很好,但是在不寻常和人为的图像上窒息,即使它们完全符合标准。将它们绊倒的常见方法是对图像使用奇数像素宽度。我的测试套件中有近一半用Windows无法查看。 (这是很多版本之前的版本,比如Windows 95.Windows编解码器已大大改进。)

我最终构建了开源PNG库并将其用作我的参考实现。只要我的代码生成的图像可以由参考实现解析,反之亦然,我称之为好。我还检查了我的代码是否可以显示Windows可以显示的任何图像。每次我发现错误时,我都会在修复之前将图像添加到测试套件中。这对我的项目来说已经足够了。

你也可以这样做。我相信有一个开源JPEG库,它被广泛用作参考实现。

如果您真的想弄清楚为什么Firefox(或其他)无法打开您的图像,您可以尝试从在Firefox中打开的图像开始。逐步进行小的更改(例如,使用十六进制编辑器),使其更像失败的图像。这可能会帮助您缩小图像的哪个方面使应用程序瘫痪。不可否认,其中一些步骤可能很难尝试。

答案 1 :(得分:0)

我认为您的文件非常不经常编码。我建议您找到一个参考文件,并尝试模仿该结构。另外,我会使用标准中的示例表。您的霍夫曼数据充满零,使每个DC值为零,然后是块结束。

如果您查看jpegsnoop,您的图像有两种色调,但它应该是同质的。我的猜测是你没有足够的数据来按照你指定的分辨率对图像进行编码。我相信很多解码器会认为这意味着你的文件已损坏。

答案 2 :(得分:0)

Firefox,(以及许多其他应用AFAIK)基于Independent JPEG group的开源JPEG库。

您可以为此下载源代码,然后查看确切原因以及何时不喜欢您的文件。

此外,这将节省您重新发明轮子: - )