如何检测jpg jpeg图像文件是否损坏(不完整)?
我要在我的网站上显示从别人的图像服务器的一些图片,但一些来自图像服务器的图像只能部分显示像下面的图片 如何检测jpg jpeg图像文件是否损坏(不完整)?
图像包括宽度和高度的信息,但仅显示最高层图像的一部分。如果我用Chrome v61打开图像,它看起来像下面的图像
Chrome v61显示此颜色以呈现png图像文件中的透明度,但它在jpg jpeg图像文件中意味着什么?
有没有人知道如何检测这种损坏(不完整)图像?我正试图避免在我的网站上显示这种图像。
如果您需要一个“编程”方法而不是@MarkSetchell建议的命令行方法,您可以使用几乎任何编程语言为此创建一个非常快速的测试。 请注意,这只会发现你在问题中提到的那种截断腐败。 Mark的方法对于发现一般腐败可能更可靠。
如我们所知,任何JPEG文件或流都是根据JPEG Interchange Format写的。这意味着它们必须以SOI(图像开始)标记(两个字节0xFF, 0xD8
)开始,并以EOI(图像结束)标记(两个字节,0xFF, 0xD9
)结束。这两个标记将不会在JPEG文件/流的其他地方找到。
如果您首先通过检查前两个字节并匹配SOI标记将文件标识为JPEG,则可以跳到末尾并向后搜索EOI标记。最有可能的是,这可能是最后两个字节,或者根本找不到它们。但是做一个搜索可能会更安全(可能是有限的长度),因为我认为在EOI之后可能会将应用程序特定的数据放在JPEG文件中(有人,如果我错了,请纠正我)。
谢谢mate.Is there任何方式,我可以识别浏览器JavaScript上损坏的JPG? – JasonHsieh
@JasonHsieh当然,如果您可以访问*压缩的*图像数据,只需按照上面概述的步骤操作即可。如果你需要编写代码的帮助,我不是那个。询问有关该任务的特定新问题,并确保包含迄今为止已尝试的内容。 – haraldK
一旦达到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。
_“图像服务器中的一些图像只能部分显示”_你能提供这种图像的**文件链接**,以便我们检查它的字节吗? –
该文件将与我上传到问题中的文件相同.http://i.stack.imgur.com/dge40.jpg – JasonHsieh
当您上传到这些网站时,这些图像更像是问题的“快照” 。我需要**原始问题文件**(检查任何**坏字节**)。如果我简单地检查一下'i.stack.imgur'图像,那么所有这些数据都会告诉我,这张Jpeg图片有很多灰色和白色方块(可能使用像Photoshop这样的图像编辑工具)。我试图看看是否可以从服务器发送的确切数据**中恢复完整映像。 –