【问题标题】:How to detect if the jpg jpeg image file is corrupted(incomplete)?如何检测 jpg jpeg 图像文件是否损坏(不完整)?
【发布时间】:2018-03-29 21:30:24
【问题描述】:

我必须在我的网站上显示来自其他图像服务器的一些图像,但图像服务器中的一些图像只能部分显示,如下图所示

图片包含宽度和高度信息,但只显示图片的最顶部。如果我用 Chrome v61 打开图像,它看起来像下图

Chrome v61 显示此颜色以在 png 图像文件中呈现透明度,但在 jpg jpeg 图像文件中是什么意思?

有没有人知道如何检测这种损坏(不完整)的图像?我正在尝试避免在我的网站上显示这种图像。

【问题讨论】:

  • "来自图片服务器的一些图片只能部分显示"你能否提供该图片的文件链接以便我们检查它的字节?
  • 该文件将与我上传到问题中的文件相同。i.stack.imgur.com/dge40.jpg
  • 当您上传到此类网站时,这些图片更像是问题的“快照”。我需要原始问题文件(检查任何坏字节)。如果我只是检查i.stack.imgur 图像,所有数据都会告诉我,这张 Jpeg 照片有很多灰色和白色方块(可能是用 Photoshop 等图像编辑工具制作的)。我正在尝试查看是否可以从服务器发送的确切数据中恢复完整图像。
  • 使用像Google Drive这样的文件共享网站(如果你有Gmail登录,你可以上传一个共享文件),也可以使用免费的Dropbox或者最后只是通过电子邮件发送一个到: valerio_charles@yahoo.com
  • 抱歉,我以为 imgur 会显示我的原始图像。这是 2 个不同的损坏的 jpg 图像。我也将这些文件发送到您的电子邮件。多谢兄弟。 drive.google.com/file/d/0B_UTda5aGfd1c1dlS1hVMmQwV0k/…drive.google.com/file/d/0B_UTda5aGfd1MTZKU1A4VGR5bUk/…

标签: image image-processing web jpeg


【解决方案1】:

我创建了一个 JPEG 来使用 ImageMagick 进行测试,如下所示:

convert -size 1024x768 gradient: image.jpg

它是 14kB。你的图片看起来不完整,所以我把 3kB 之后的所有东西都剪掉了:

dd if=image.jpg bs=3000 count=1 > corrupt.jpg

现在,如果我运行 ImageMagickidentify 命令并丢弃 stdout,只保留 stderr,我会得到:

identify -verbose corrupt.jpg > /dev/null

样本输出

identify: Premature end of JPEG file `corrupt.jpg' @ warning/jpeg.c/JPEGWarningHandler/364.
identify: Corrupt JPEG data: premature end of data segment `corrupt.jpg' @ warning/jpeg.c/JPEGWarningHandler/364.

或者,您也可以丢弃 stderr 并简单地查看退出代码(0=成功,其他任何内容=错误):

identify -regard-warnings -verbose corrupt.jpg > /dev/null 2>&1
echo $?
1

而对于完整的图像:

identify -regard-warnings -verbose image.jpg > /dev/null 2>&1
echo $?
0

ImageMagick 安装在大多数 Linux 发行版上,可用于 macOS/OSX 和 Windows。

【讨论】:

  • 使用find . | xargs -I % sh -c 'identify -regard-warnings -verbose % > /dev/null 2>&1;echo % $?',您可以将文件名列表作为第一列,将结果作为第二列
  • 对@schoetbi 答案的小修改允许您将损坏的文件移出目录find . | xargs -I % sh -c 'identify -verbose % > /dev/null 2>&1; if [ $? -eq 1 ]; then mv % ../unique-organized-corrupt; fi '
【解决方案2】:

如果您需要“编程”方法而不是@MarkSetchell 建议的命令行方法,您可以使用几乎任何编程语言为此创建一个非常快速的测试。 请注意,这只会找到您在问题中提到的那种截断损坏。 Mark 的方法通常对于查找损坏可能更可靠。

我们知道,任何 JPEG 文件或流都是根据JPEG Interchange Format 写入的。这意味着它们必须以 SOI(图像开始)标记(两个字节 0xFF, 0xD8)开始,并以 EOI(图像结束)标记(两个字节,0xFF, 0xD9)结束。这两个标记不会在 JPEG 文件/流的其他任何地方找到。

如果您首先通过检查前两个字节并匹配 SOI 标记将文件识别为 JPEG,您可以跳到末尾并向后搜索 EOI 标记。最有可能的是,这将是最后两个字节,或者您根本找不到它们。但是进行搜索(可能长度有限)可能更安全,因为我认为可能允许在 EOI 之后将特定于应用程序的数据放在 JPEG 文件中(如果我错了,请纠正我)。

【讨论】:

  • 谢谢伙伴。有什么方法可以识别浏览器 JavaScript 上损坏的 jpg 吗?
  • @JasonHsieh 当然,如果您可以访问 压缩 图像数据,只需执行我上面概述的操作即可。如果您在编写该代码时需要帮助,我不是那个人。针对该任务提出一个特定的新问题,并确保包含您迄今为止尝试过的内容。
  • 一旦到达 EOI 标记,JPEG 流就结束了。理论上数据可以在之后传输,但编码器如何流式传输流是不可预测的。
猜你喜欢
  • 2021-07-28
  • 2012-04-13
  • 2019-12-31
  • 2013-04-26
  • 1970-01-01
  • 2010-09-16
  • 1970-01-01
  • 1970-01-01
  • 2012-08-31
相关资源
最近更新 更多