是否可以读取 JPEG 文件并跳过损坏的部分?我有三个损坏的 JPEG 文件,我可以检测到第一个损坏的块,但我可以跳过它并继续下一个块吗?
到目前为止,我已经可以停止并转换已处理的块,但我想尽可能多地恢复。这不是一个序列中的 JPEG,因此跳过所有剩余的块将无济于事。
是否可以读取 JPEG 文件并跳过损坏的部分?我有三个损坏的 JPEG 文件,我可以检测到第一个损坏的块,但我可以跳过它并继续下一个块吗?
到目前为止,我已经可以停止并转换已处理的块,但我想尽可能多地恢复。这不是一个序列中的 JPEG,因此跳过所有剩余的块将无济于事。
这是一个难题,因为图像数据是使用可变长度代码 (VLC) 编码的。这意味着每个 DCT 系数的起始位取决于所有先前的系数。单个位错误通常会为该系数产生不同的代码长度,进而导致图像其余部分的对齐失败。
我之前编写过自动化程序来切换第一个损坏块的位置,并尝试找出错误可能在哪里。基本上,它只是稍微切换一下,重新解码图像,然后运行某种度量来确定它是否有帮助。如果多个误码靠近,此方法可能有效,也可能无效。关键是您不一定需要修复所有位错误,只需生成一个长度合适的 VLC 即可恢复对齐。
任何压缩格式的 VLC 编码几乎无法恢复,甚至理论上也无法恢复。
但是,大多数文件格式都对此给予了应有的重视。因此,如果您正在阅读 JPEG 文件 - 典型的 JFIF 格式的 .jpg - 这实际上非常容易。
基本上,有许多标记放置在流中,这些标记形成这些文件中单独运行的片段,这些片段是可独立识别的。一个段的 VLC 编码独立于另一个段 - 因此,如果您发现字节的特定部分损坏,您可以简单地放弃对该段的 VLC 解码并搜索下一个段标记。通常,相同的概念用于制作 MPEG 压缩视频,以在流错误的情况下允许跳过。
对于 JPEG 的 JFIF 格式,有以下标记有助于实现上述目标:
一种。SOS n(扫描开始)标记 b。SOF(帧开始)标记 c.RST n(重启)标记
有关更多信息,请参阅参考资料:
恢复损坏点之外的 JPEG 图像的唯一真正机会是它是否具有重新启动标记。否则,您将无法知道数据是否丢失或损坏以及该损坏如何影响 DC 值。重新启动标记旨在通过定期重置 DC 值来解决这种情况。重新开始标记的低 3 位不断增加,以便您也可以知道丢失数据的数量。不幸的是,很少有 JPEG 图像包含重新启动标记,因为它们被假定用于无错误通道。