PHP - 新的 Imagick 更改图像的 md5()
PHP - New Imagick changes md5() of an image
我正在开发需要检查图像的 md5 以防止上传重复图像的图像上传器。
上传图像时,我使用上传的路径创建一个新的 Imagick 并获取图像的内容。从命令行调用 md5() 并传递图像内容 returns 与 PHP 的 md5_file 和 md5sum 不同的值。
md5 存储在数据库中的设计图像对象上,因为我需要将上传图像的 md5 与现有图像进行比较。问题是每次上传相同的图像时,在新的 Imagick 内容 returns 上调用 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() 结果不同?
提前致谢。
问题是 PNG 文件和其他一些格式在文件中包含创建日期和时间,而该日期会有所不同。 ImageMagick 具有 built-in 仅检查图像数据本身的功能,而不是 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)
我正在开发需要检查图像的 md5 以防止上传重复图像的图像上传器。 上传图像时,我使用上传的路径创建一个新的 Imagick 并获取图像的内容。从命令行调用 md5() 并传递图像内容 returns 与 PHP 的 md5_file 和 md5sum 不同的值。 md5 存储在数据库中的设计图像对象上,因为我需要将上传图像的 md5 与现有图像进行比较。问题是每次上传相同的图像时,在新的 Imagick 内容 returns 上调用 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() 结果不同? 提前致谢。
问题是 PNG 文件和其他一些格式在文件中包含创建日期和时间,而该日期会有所不同。 ImageMagick 具有 built-in 仅检查图像数据本身的功能,而不是 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)