PHP - 新的Imagick更改了图像的md5()值

5

我正在开发一款图片上传工具,需要检查图片的md5值,以防止上传重复的图片。当一张图片被上传后,我会使用上传路径创建一个新的Imagick对象,并获取图像内容。调用md5()函数并传递图像内容的返回值与PHP的md5_file和命令行中的md5sum返回的值不同。由于需要比较上传图像的md5值与现有图像的md5值,因此将md5存储在数据库中的设计图像对象上。然而,问题在于每次上传相同的图片时,对新的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 是文件的字符串表示,而不是文件本身。 - castis
1个回答

4

问题在于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)函数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接