是否有檢測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