Jas*_*ieh 4 jpeg image image-processing web
我必须在网站上显示来自其他人的图像服务器的某些图像,但是来自图像服务器的一些图像只能部分显示,如下面的图像

该图像包括宽度和高度信息,但仅显示图像的顶部。如果我使用Chrome v61打开图像,则如下图所示

Chrome v61会显示此颜色以在png图像文件中呈现透明度,但是在jpg jpeg图像文件中意味着什么?
有谁知道如何检测这种损坏的(不完整)图像?我试图避免这种图像显示在我的网站上。
har*_*ldK 14
如果您需要“编程”方法而不是@MarkSetchell 建议的命令行方法,您可以使用几乎任何编程语言为此创建一个非常快速的测试。请注意,这只会找到您在问题中提到的那种截断损坏。马克的方法可能更可靠地发现一般的腐败。
众所周知,任何 JPEG 文件或流都是根据JPEG 交换格式编写的。这意味着它们必须以 SOI(图像开始)标记(两个字节0xFF, 0xD8)开始,并以 EOI(图像结束)标记(两个字节,0xFF, 0xD9)结束。这两个标记不会在 JPEG 文件/流中的其他任何地方找到。
如果您首先通过检查前两个字节并与 SOI 标记匹配来将文件识别为 JPEG,则您可以跳到最后并向后搜索 EOI 标记。最有可能的是,这要么是最后两个字节,要么根本找不到它们。但是进行搜索可能更安全(可能是有限的长度),因为我认为可能允许将特定于应用程序的数据放在 EOI 之后的 JPEG 文件中(有人,如果我错了,请纠正我)。
Mar*_*ell 10
我创建了一个JPEG来使用ImageMagick对此进行测试,如下所示:
convert -size 1024x768 gradient: image.jpg
Run Code Online (Sandbox Code Playgroud)
那是14kB。您的图片看起来不完整,因此我在3kB之后将所有内容砍掉,如下所示:
dd if=image.jpg bs=3000 count=1 > corrupt.jpg
Run Code Online (Sandbox Code Playgroud)
现在,如果我运行ImageMagick的identify命令并放弃stdout,仅保留stderr,我将得到:
identify -verbose corrupt.jpg > /dev/null
Run Code Online (Sandbox Code Playgroud)
样本输出
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.
Run Code Online (Sandbox Code Playgroud)
另外,您也可以丢弃它,stderr而只需查看退出代码(0 =成功,其他=错误):
identify -regard-warnings -verbose corrupt.jpg > /dev/null 2>&1
echo $?
1
Run Code Online (Sandbox Code Playgroud)
而完整的图像:
identify -regard-warnings -verbose image.jpg > /dev/null 2>&1
echo $?
0
Run Code Online (Sandbox Code Playgroud)
ImageMagick已安装在大多数Linux发行版上,并且可用于macOS / OSX和Windows。