是否有一种有效的方法来检测jpeg文件是否已损坏?
背景资料:
解决方案需要在php脚本中工作
jpeg文件在磁盘上
手动检查是没有选项(用户上传的数据)
我知道imagecreatefromjpeg(string $filename);
可以做到。但这样做很慢。
有人知道更快/更有效的解决方案吗?
答案 0 :(得分:17)
从命令行,您可以使用jpeginfo查明jpeg文件是否正常。
$ jpeginfo -c test.jpeg
test.jpeg 260 x 264 24bit JFIF N 15332 [确定]
从php调用jpeginfo应该是微不足道的。
答案 1 :(得分:8)
我最简单(也是最快)的解决方案:
function jpeg_file_is_complete($path) {
if (!is_resource($file = fopen($path, 'rb'))) {
return FALSE;
}
// check for the existence of the EOI segment header at the end of the file
if (0 !== fseek($file, -2, SEEK_END) || "\xFF\xD9" !== fread($file, 2)) {
fclose($file);
return FALSE;
}
fclose($file);
return TRUE;
}
function jpeg_file_is_corrupted($path) {
return !jpeg_file_is_complete($path);
}
注意:这仅检测到损坏的文件结构,但不检测损坏的图像数据。
答案 2 :(得分:6)
仅供参考 - 我使用the method above (jpeg_file_is_complete
)来测试我知道已损坏的JPEG(当我在浏览器中加载它们时,例如,底部是灰色的 - 即图像被“切断” )。无论如何,当我在该图像上运行上述测试时,它不会将其检测为损坏。
到目前为止,使用imagecreatefromjpeg()
有效,但速度不是很快。我发现使用jpeginfo
也可以检测这些类型的损坏图像,并且比imagecreatefromjpeg
更快(我使用microtime()
在我的PHP中运行了基准测试。)
答案 3 :(得分:0)
请尝试
<?php
$img = $_GET['img'];
$str_exec = 'jpeginfo -c /chroot/home/www/html/media/'.$img;
$result = exec($str_exec);
if(strpos($result, 'ERROR'))
{
echo 'ERROR';
}
else
{
echo 'OK';
}
?>
答案 4 :(得分:0)
只是一个小小的注释 - 如何获取Windows的Jpeginfo(64位)? 作者的github上没有win32 / win64二进制文件,但你可以这样做:
1)从此存档中抓取jpeginfo.exe
:
https://github.com/MoserMichael/cstuff/raw/master/img-archive/img-archive.zip
2)从此存档中抓取cygwin1.dll
:
ftp://mirror.internode.on.net/pub/cygwin/x86/release/cygwin64/cygwin64-2.6.0-1.tar.xz
如果有效,请从命令行进行测试:jpeginfo --help
。如果有信息 - 它可以正常工作。
如何测试jpeginfo输出?
jpeginfo
如果文件正常则返回0,但不仅在它不存在时返回1,而且当它找到不理解的东西时返回1。然后它会生成如下消息:
Warning: unknown JFIF revision number 2.01 1280 x 720 24bit JFIF N 122550 [WARNING]
在损坏的文件上,它返回1并且消息如下:
1328 x 2048 24bit JFIF N 1310080 Premature end of JPEG file [WARNING]
因此,您可能希望测试实际输出,而不仅仅是返回代码。
答案 5 :(得分:-1)
您也可以尝试基于MD5生成文件哈希,并将其用作校验和,以验证各个步骤的JPEG数据。例如,从文件中读取后,然后在传输后等等。
答案 6 :(得分:-1)
解决方案:
我找到了我需要的完美工具:
以递归方式搜索目录并查找任何损坏的JPEGS。看起来你也可以使用尽可能多的CPU。
为我工作。
答案 7 :(得分:-3)
我还有一个简单的getimagesize()
的解决方案if(!getimagesize($image_url)) echo 'Image is corrupt or not readable';