2017-01-17 70 views
4

我正在處理圖像上傳器,需要檢查圖像的md5以防止上傳重複圖像。 上傳圖片時,我使用上傳的路徑創建一個新的Imagick並獲取圖片的內容。調用md5()並傳遞圖像內容將從PHP的md5_file和命令行中的md5sum返回不同的值。 md5存儲在數據庫中的設計圖像對象上,因爲我需要將上傳圖像的md5與現有圖像進行比較。問題是在新的Imagick內容上調用md5會在每次上傳相同的圖像時返回不同的值。PHP - 新Imagick更改圖像的md5()

$sUploadedImage = '/home/user/test-12x14.png'; 

md5(file_get_contents($sUploadedImage)); 
returns 2352513cde38cfb678cf46b6421f2f8b 

md5_file($sUploadedImage); 
returns 2352513cde38cfb678cf46b6421f2f8b 

// md5sum on Linux 
md5sum /home/user/test-12x14.png 
returns 2352513cde38cfb678cf46b6421f2f8b 

$oImagick = new Imagick($sUploadedImage); 
md5($oImagick->getImageBlob()); 
returns 0a8acb080aedf6245b56d39fb705705f 
//returns different value on everytime same image is uploaded 

$sNewPath = sfConfig::get('sf_root_dir') . '/design-images/' .$sMd5 .'.png'; 
$oNewImage->writeFileWithFormat($sNewPath, 'png'); 

md5(file_get_contents($sNewPath)); 
returns 2352513cde38cfb678cf46b6421f2f8b 

md5_file($sNewPath); 
returns 2352513cde38cfb678cf46b6421f2f8b 

爲什麼Imagick上的md5()結果不同? 在此先感謝。

+1

[它的不同之處在於圖像blob是文件的字符串表示,而不是文件。](http://php.net/manual/en/imagick.getimageblob.php) – castis

回答

3

問題是PNG文件和一些其他格式在文件中包含創建日期和時間,該日期將有所不同。 ImageMagick具有內置函數,只檢查圖像數據本身,而不檢查包括元數據在內的整個文件,而不是md5sum

看到這裏在命令行中,我在他們創建具有完全相同的梯度兩個圖像:

convert -size 256x256 gradient:red-yellow a.png 
convert -size 256x256 gradient:red-yellow b.png 

現在用md5sum檢查它們和它們之間的區別:

md5 [ab].png 
MD5 (a.png) = fbd2be1c89edad043b1d128aaf32a042 
MD5 (b.png) = ab08909a80d347d573f5f0f68b2b342e 

但檢查只是圖像數據,而不是元數據和它們是相同的:

identify -format "%#\n" [ab].png 
47d48b4144f35ca431e7db577a2b6284ef90649c30ffe9c0b9234aa282297c61 
47d48b4144f35ca431e7db577a2b6284ef90649c30ffe9c0b9234aa282297c61 

在PHP中,你可能想要Imagick::getImageSignature(void)