是否有检测jpeg文件是否损坏的有效方法?高效检测损坏的jpeg文件?
背景信息:
解决方案需要从PHP脚本
的JPEG文件在磁盘内工作
手动检查是别无选择(用户上载的数据)
我知道imagecreatefromjpeg(string $filename);
能做到这一点。但这样做很慢。
有人知道更快/更有效的解决方案吗?
是否有检测jpeg文件是否损坏的有效方法?高效检测损坏的jpeg文件?
背景信息:
解决方案需要从PHP脚本
的JPEG文件在磁盘内工作
手动检查是别无选择(用户上载的数据)
我知道imagecreatefromjpeg(string $filename);
能做到这一点。但这样做很慢。
有人知道更快/更有效的解决方案吗?
在命令行中,您可以使用jpeginfo来查明jpeg文件是否正确。
$ jpeginfo -c test.jpeg
test.jpeg 260 X 264的24bit JFIFÑ15332 [OK]
它应该是微不足道从PHP调用jpeginfo。
我最简单,最快的解决方案:
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);
}
注:这仅检测到损坏的文件结构,但不检测损坏的图像数据。
您也可以尝试根据MD5生成文件哈希,并将其用作校验和以验证各个步骤中的JPEG数据。例如,在从文件读取后,然后在传输之后等。
仅供参考 - 我用the method above (jpeg_file_is_complete
)来测试我知道已损坏的JPEG(当我在浏览器中加载它们时,例如,底部是灰色的 - 即图像被“切断”)。无论如何,当我在该图像上运行上述测试时,它不会将其检测为损坏。
到目前为止,使用imagecreatefromjpeg()
作品,但不是很快。我发现使用jpeginfo
也适用于检测这些类型的损坏图像,并且比imagecreatefromjpeg
更快(我在我的PHP中使用microtime()
运行了基准测试)。
解决方案:
我找到了完美的工具,我需要的东西:
递归搜索通过目录和发现任何损坏的JPEG文件。看起来像你可以使用尽可能多的CPU,也可以。
为我工作。
我有一个其它解决方案只是和getimagesize()
if(!getimagesize($image_url)) echo 'Image is corrupt or not readable';
请您尝试一下
<?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';
}
?>
只是一个小笔记记录如何获得jpeginfo的Windows(64位)? 上有作者的github上没有的Win32/Win64的二进制代码,但是你可以这样做: 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
1)从该文档抢jpeginfo.exe
如果有效,请从命令行测试它: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]
因此,您可能要测试的实际输出不仅返回代码。
注意到OP关于slow的评论:分叉外部进程并处理返回可能比imagecreatefromjpeg()更慢! – Willem 2008-10-14 13:56:32
你可能是对的,我不知道imagecreatefromjpeg有多慢。我想只有这样才能找到它来衡量两者。 – Pat 2008-10-15 08:08:28
尽管分叉外部进程很慢,但它是更好的选择。在阅读图像文件时,PHP在内存要求和速度上很糟糕。另请参阅[特拉维斯的答案](http://stackoverflow.com/questions/198438/efficiently-detect-corrupted-jpeg-file/2761021#2761021)。 – Jacco 2011-06-11 10:35:45