2008-10-13 169 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]

因此,您可能要測試的實際輸出不僅返回代碼。