C jpeg文件格式解码

C jpeg文件格式解码,c,image,compression,jpeg,file-format,C,Image,Compression,Jpeg,File Format,我正在尝试使用C从头开始编写JPEG/JFIF编码器和解码器。我尝试编写一个示例JPEG文件,但似乎无法使用MS paint、Firefox打开它。但我可以使用JPEGsnoop()和。我认为示例JPEG文件符合JPEG/JFIF标准,我不知道为什么MS paint和Firefox等应用程序无法打开它 以下是示例JPEG的外观: SOI APP0 segment DQT segment (contains two quantization tables)

我正在尝试使用C从头开始编写JPEG/JFIF编码器和解码器。我尝试编写一个示例JPEG文件,但似乎无法使用MS paint、Firefox打开它。但我可以使用JPEGsnoop()和。我认为示例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 索伊 APP0段 DQT段(包含两个量化表) COM段 SOF0段 DHT段(包含四个哈夫曼表) SOS部分 哈夫曼编码数据 意向书 示例JPEG文件有三个分量Y Cb Cr。Cb Cr分量没有子采样。 这两个量化表都用1填充。 DHT段中的四个哈夫曼表都是相同的,看起来像这样

[0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0] [0,1,2, ... , 254] [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) [0x0000(直流)0x0000(交流)](Y) [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)的链接。

几年前,我在一些PNG代码中遇到了类似的问题(尽管我不是从头开始编写的)。事实证明,我的代码比Windows、某些浏览器等的库更符合标准。它们在典型情况下表现良好,但被不寻常和人为的图像阻塞,即使它们完全符合标准。一种常见的方法是对图像使用奇数像素宽度。我的测试套件几乎有一半无法在Windows中查看。(这是许多版本以前的版本,如Windows 95。Windows编解码器有了很大的改进。)

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

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


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

我认为您的文件的编码非常非常规。我建议您找到一个参考文件,并尝试模仿该结构。此外,我将使用标准中的示例表。您的哈夫曼数据充满了零,使得每个DC值都为零,然后是和块的末尾

如果您查看JPEG Snoop,您的图像有两种色调,但应该是均匀的。我猜您没有足够的数据以指定的分辨率对图像进行编码。我相信很多解码器都会认为这意味着你的文件已经损坏。

Firefox(以及许多其他应用程序AFAIK)是基于开源的JPEG库的

您可以下载此文件的源代码,然后查看它不喜欢您的文件的确切原因和时间


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

您可以提供指向示例文件的链接吗?为什么关闭?海报做了很多工作,清楚地提出了问题,并解释了他们在做什么。