【问题标题】:Reliably verify file is valid JPG可靠地验证文件是否有效 JPG
【发布时间】:2019-02-26 10:40:51
【问题描述】:

我制作了一个脚本,可以使用 JPEG 幻数从任何文件中提取 JPG(数据以 FFD8 开头,以 FFD9 结尾)。

但这还不够,因为许多带有 JPEG 幻数的数据段不是实际的 JPEG,只是其他随机数据位,如果您尝试将它们作为 JPEG 打开,则会引发错误。

可以进行哪些额外的字节检查来验证 JPEG 文件的有效性(每个 jpeg 中都会存在的标记)。

【问题讨论】:

  • 如果你想做正确的验证工作,为什么不使用你最喜欢的图像加载器库或实用程序加载 JPEG?如果image-load函数调用成功,调用good;如果失败了,就说它坏了。
  • JFIF文件格式除了这些还有很多其他的标记,反正位置不严格,可能要看内容。只是谷歌它。但如果您不需要额外的性能,尝试使用现有库进行解码可能就足够了。
  • @JeremyFriesner 我的实用程序是基于浏览器的,看看:x0a.github.io/thumbdata3-viewer 虽然 img.onerror 可以肯定地确定图像的有效性,但对于可能包含 10000s 的 5gb 文件来说有点贵匹配段。所以如果我能找到一个好的二进制检查会产生奇迹。

标签: validation jpeg


【解决方案1】:

答案取决于您想要进行的检查级别。每个 JPEG 流都应该在开头有一个 SOI 标记,在结尾有一个 EOI 标记。理论上,在 JPEG 图像之外的 EOI 市场之后可能会有数据。

下一层,您可以检查是否有 SOFx 标记。应该只有一个。

然后您可以确保有足够的 SOS 标记。在顺序 JPEG 中,每个组件都应该有一个。对于渐进式 JPEG,您需要进行更多检查。

然后您可以检查是否存在 SOS 标记所需的所有 DHT 和 DQT 标记。

最后,您可以查看扫描数据,这需要对图像进行解压缩。

【讨论】:

  • 正是我正在寻找的答案。谢谢!
  • EOI标记后的数据不仅仅在理论上出现。许多(如果不是大多数)相机制造商在 EOI 标记后用空字节填充其 JPG 文件。我的索尼相机中的图片最后包含大约 9000 个空字节。
【解决方案2】:

我发现的一个非常可靠的检查是找到帧开始字节标记(完整表here)。 ff c0ff c2

从那里收集字节直到标头结束(以定义的开头)ff c4ff dbff dd

现在你有了一个帧头。前两个字节告诉您标头的长度。确认收集的字节数与前两个字节的值匹配。标头长度通常为 16。

如果ff c0 || ff c2ff c4 || ff db || ff dd之间的长度与前两个字节的值不匹配,或者如果没有找到这样的字节序列,那么它不是一个有效的JPEG。

【讨论】:

    猜你喜欢
    • 2019-03-30
    • 1970-01-01
    • 2020-01-02
    • 1970-01-01
    • 2015-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-11
    相关资源
    最近更新 更多