如何检测jpg jpeg图像文件是否损坏(不完整)?

问题描述:

我要在我的网站上显示从别人的图像服务器的一些图片,但一些来自图像服务器的图像只能部分显示像下面的图片 enter image description here如何检测jpg jpeg图像文件是否损坏(不完整)?

图像包括宽度和高度的信息,但仅显示最高层图像的一部分。如果我用Chrome v61打开图像,它看起来像下面的图像 enter image description here

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

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

+0

_“图像服务器中的一些图像只能部分显示”_你能提供这种图像的**文件链接**,以便我们检查它的字节吗? –

+0

该文件将与我上传到问题中的文件相同.http://i.stack.imgur.com/dge40.jpg – JasonHsieh

+0

当您上传到这些网站时,这些图像更像是问题的“快照” 。我需要**原始问题文件**(检查任何**坏字节**)。如果我简单地检查一下'i.stack.imgur'图像,那么所有这些数据都会告诉我,这张Jpeg图片有很多灰色和白色方块(可能使用像Photoshop这样的图像编辑工具)。我试图看看是否可以从服务器发送的确切数据**中恢复完整映像。 –

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

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

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

+0

谢谢mate.Is there任何方式,我可以识别浏览器JavaScript上损坏的JPG? – JasonHsieh

+0

@JasonHsieh当然,如果您可以访问*压缩的*图像数据,只需按照上面概述的步骤操作即可。如果你需要编写代码的帮助,我不是那个。询问有关该任务的特定新问题,并确保包含迄今为止已尝试的内容。 – haraldK

+0

一旦达到EOI标记,JPEG流就结束了。从理论上讲,数据可以在之后进行,但编码器如何流式传输是不可预测的。 – user3344003

我创建了一个JPEG,以测试这个使用ImageMagick的如下:

convert -size 1024x768 gradient: image.jpg 

,这是14KB。您的图片看起来是不完整的,所以我砍掉一切3KB后是这样的:

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

现在,如果我跑ImageMagick的identify命令和放弃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。