16

是否有一种有效的方法来检测 jpeg 文件是否损坏?

背景信息:
  解决方案需要在 php 脚本
  中工作 jpeg 文件在磁​​盘上
  手动检查是没有选择的(用户上传的数据)

我知道imagecreatefromjpeg(string $filename);可以做到。但是这样做的速度很慢。

有人知道更快/更有效的解决方案吗?

4

8 回答 8

18

在命令行中,您可以使用 jpeginfo 来确定 jpeg 文件是否正常。

$ jpeginfo -c test.jpeg

test.jpeg 260 x 264 24bit JFIF N 15332 [OK]

从 php.ini 调用 jpeginfo 应该很简单。

于 2008-10-13T18:19:47.403 回答
9

我最简单(也是最快)的解决方案:


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);
}

注意:这只会检测损坏的文件结构,但不会检测损坏的图像数据。

于 2009-10-25T23:55:25.193 回答
6

仅供参考——我已经使用上面方法jpeg_file_is_complete(无论如何,当我对该图像进行上述测试时,它没有检测到它已损坏。

到目前为止,使用imagecreatefromjpeg()工作,但不是很快。我发现 usingjpeginfo也可以检测这些类型的损坏图像,并且比imagecreatefromjpeg(我在我的 PHP 中使用 运行基准测试)更快microtime()

于 2010-05-03T20:33:27.003 回答
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';
}
?>
于 2015-12-15T14:51:07.977 回答
0

只是一个小提示-如何获取适用于 Windows(64 位)的 jpeginfo? 作者的 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]

因此,您可能不仅要测试返回代码,还要测试实际输出。

于 2017-05-10T19:01:28.407 回答
-1

您也可以尝试根据 MD5 生成文件哈希,并将其用作校验和,以在各个步骤中验证 JPEG 数据。例如,从文件读取之后,然后在传输之后,等等。

于 2010-01-22T18:15:38.433 回答
-1

解决方案:

我找到了满足我需要的完美工具:

http://www.thomasbarker.co.uk/2011/05/29/corrupt-jpeg-checkertool-for-finding-corrupt-jpeg-image-files/

递归搜索目录并找到任何损坏的 JPEGS。看起来您也可以使用任意数量的 CPU。

为我工作。

于 2013-04-03T02:58:25.703 回答
-3

我还有一个简单的 getimagesize() 解决方案

if(!getimagesize($image_url)) echo 'Image is corrupt or not readable';
于 2014-03-28T20:25:05.023 回答