2008-10-13 171 views
13

是否有检测jpeg文件是否损坏的有效方法?高效检测损坏的jpeg文件?

背景信息:
 解决方案需要从PHP脚本
 的JPEG文件在磁盘内工作
 手动检查是别无选择(用户上载的数据)

我知道imagecreatefromjpeg(string $filename);能做到这一点。但这样做很慢。

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

回答

16

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

$ jpeginfo -c test.jpeg

test.jpeg 260 X 264的24bit JFIFÑ15332 [OK]

它应该是微不足道从PHP调用jpeginfo。

+2

注意到OP关于slow的评论:分叉外部进程并处理返回可能比imagecreatefromjpeg()更慢! – Willem 2008-10-14 13:56:32

+0

你可能是对的,我不知道imagecreatefromjpeg有多慢。我想只有这样才能找到它来衡量两者。 – Pat 2008-10-15 08:08:28

+0

尽管分叉外部进程很慢,但它是更好的选择。在阅读图像文件时,PHP在内存要求和速度上很糟糕。另请参阅[特拉维斯的答案](http://stackoverflow.com/questions/198438/efficiently-detect-corrupted-jpeg-file/2761021#2761021)。 – Jacco 2011-06-11 10:35:45

7

我最简单,最快的解决方案:


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

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

-1

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

6

仅供参考 - 我用the method above (jpeg_file_is_complete)来测试我知道已损坏的JPEG(当我在浏览器中加载它们时,例如,底部是灰色的 - 即图像被“切断”)。无论如何,当我在该图像上运行上述测试时,它不会将其检测为损坏。

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

-3

我有一个其它解决方案只是和getimagesize()

if(!getimagesize($image_url)) echo 'Image is corrupt or not readable'; 
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'; 
} 
?> 
0

只是一个小笔记记录如何获得jpeginfo的Windows(64位)? 上有作者的github上没有的Win32/Win64的二进制代码,但是你可以这样做: https://github.com/MoserMichael/cstuff/raw/master/img-archive/img-archive.zip

2)从该文档抢cygwin1.dllftp://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]

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