【问题标题】:Weird results using PHP-Imagick getImageSignature method使用 PHP-Imagick getImageSignature 方法的奇怪结果
【发布时间】:2014-08-04 12:59:50
【问题描述】:

我正在尝试使用 PHP Imagick 的 getImageSignature 方法来比较不同的图像并查看它们是否相等,但是当从具有不同版本的不同计算机调用该方法时,即使使用相同的图像文件,我也会得到不同的签名ImageMagick 和操作系统。

在这些情况下我是否应该始终获得相同的签名?

非常感谢。

【问题讨论】:

    标签: php imagemagick imagick


    【解决方案1】:

    在这些情况下我是否应该始终获得相同的签名?

    简短的回答是否定的。

    Imagick::getImageSignature 包装了MagickGetImageSignature,它在内存和量子色彩空间中基于运行时的虚拟像素生成签名。后者受编译时配置选项或环境参数的影响。版本和主机架构的差异会导致图像签名的变化。

    由于签名只是一个 SHA-256 摘要,因此自己生成一个会更简单。

    $signature = sha1($image->getImageBlob());
    // or subclass the method
    class MyImagick extends Imagick {
     public function getMyImageSignature() {
       return sha1($this->getImageBlob());
     }
    }
    

    【讨论】:

    • 感谢您的回答,但您的灵魂提示它也不起作用。它从同一个文件中产生两个不同的哈希值。
    • 很公平。听起来问题存在于您的应用程序中,而不是 imagemagick。请发布您的代码以及失败的测试用例。
    • 我使用的代码和你提供的例子一样简单: $imagick = new Imagick( 'demo.jpg' );回声 sha1( $imagick->getImageBlob() );并且通过那段代码,我使用相同的文件但 2 个不同的操作系统得到 2 个不同的字符串。 系统 A:** Windows 2003(32 位)PHP 5.4.11 ImageMagick 6.8.3-0 2013-02-13 Q8 **系统 B: Debian 7.0 PHP 5.4.4 ImageMagick 6.7.7-10 2012-11-06 Q16 你可以在salom.me/demo.jpg查看演示文件非常感谢。
    • 感谢演示图片。当 JPEG 解压缩到虚拟内存中时,Q8Q16 之间的差异意味着 32 位 Windows 2003 将失去精度。即使演示图像只有 8 位深度。不同的签名是正确的行为,因为磁盘上的同一个文件不保证内存中的同一个文件。
    • 是的,这很公平,但我还使用 2 台运行 Debian 和 Image Magick Q16 的不同计算机测试了该文件。同样的结果:sha1(getImageBlob()) 上有 2 个不同的签名和 2 个不同的结果。我想我被打败了,我必须使用同一台机器来生成这个项目的每一个签名。无论如何,非常感谢您的时间和帮助。
    猜你喜欢
    • 2013-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-17
    • 2019-05-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多