跳过 jpeg 的损坏部分

信息处理 图像处理 图像压缩 JPEG
2022-02-15 09:43:45

是否可以读取 JPEG 文件并跳过损坏的部分?我有三个损坏的 JPEG 文件,我可以检测到第一个损坏的块,但我可以跳过它并继续下一个块吗?

到目前为止,我已经可以停止并转换已处理的块,但我想尽可能多地恢复。这不是一个序列中的 JPEG,因此跳过所有剩余的块将无济于事。

4个回答

这是一个难题,因为图像数据是使用可变长度代码 (VLC) 编码的。这意味着每个 DCT 系数的起始位取决于所有先前的系数。单个位错误通常会为该系数产生不同的代码长度,进而导致图像其余部分的对齐失败。

我之前编写过自动化程序来切换第一个损坏块的位置,并尝试找出错误可能在哪里。基本上,它只是稍微切换一下,重新解码图像,然后运行某种度量来确定它是否有帮助。如果多个误码靠近,此方法可能有效,也可能无效。关键是您不一定需要修复所有位错误,只需生成一个长度合适的 VLC 即可恢复对齐。

任何压缩格式的 VLC 编码几乎无法恢复,甚至理论上也无法恢复。

但是,大多数文件格式都对此给予了应有的重视。因此,如果您正在阅读 JPEG 文件 - 典型的 JFIF 格式的 .jpg - 这实际上非常容易。

基本上,有许多标记放置在流中,这些标记形成这些文件中单独运行的片段,这些片段是可独立识别的。一个段的 VLC 编码独立于另一个段 - 因此,如果您发现字节的特定部分损坏,您可以简单地放弃对该段的 VLC 解码并搜索下一个段标记。通常,相同的概念用于制作 MPEG 压缩视频,以在流错误的情况下允许跳过。

对于 JPEG 的 JFIF 格式,有以下标记有助于实现上述目标:

一种。SOS n(扫描开始)标记 b。SOF(帧开始)标记 c.RST n(重启)标记

有关更多信息,请参阅参考资料:

  1. JFIF 文件格式 - http://www.w3.org/Graphics/JPEG/jfif3.pdf
  2. FileFormat.Info - http://www.fileformat.info/format/jpeg/egff.htm
  3. 图书压缩图像文件格式:JPEG、PNG、GIF、XBM、BMP by John Miano

恢复损坏点之外的 JPEG 图像的唯一真正机会是它是否具有重新启动标记。否则,您将无法知道数据是否丢失或损坏以及该损坏如何影响 DC 值。重新启动标记旨在通过定期重置 DC 值来解决这种情况。重新开始标记的低 3 位不断增加,以便您也可以知道丢失数据的数量。不幸的是,很少有 JPEG 图像包含重新启动标记,因为它们被假定用于无错误通道。

通常可以检测到无效标记或 Huffman 解压缩错误。但是,如果底部是灰色的,则很可能是 JPEG 图像数据中的无效标记。JPEGSnoop将告诉确切的字节,例如使用HxD编辑有问题的 FF xx 标记,并且图像的其余部分将解码(除非损坏更广泛)。在下面的示例中,我仅编辑一个字节(FF xx > FF 00)并保存文件,该文件允许对其余图像进行解码,如旧 Windows 照片查看器立即显示的那样。

FF xx 被 JPEG 视为标记(已知标记)。除了重启和 EOI 标记外,编码图像数据中的任何其他标记通常都会使图像查看器停止解码。随机位损坏甚至会导致标记无效。删除有问题的标记就足够了。

在此处输入图像描述