Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何从Imagick对象获取sha1哈希?_Php_Sha1_Imagick - Fatal编程技术网

Php 如何从Imagick对象获取sha1哈希?

Php 如何从Imagick对象获取sha1哈希?,php,sha1,imagick,Php,Sha1,Imagick,这个网站有点像画廊。但要防止重复条目。我想和他们匹配。它不会是100%防弹图像匹配,但对于我的需要,它绝对完美的解决方案 唯一的问题是,我不知道从Imagick$image对象获取sha1的正确方法 这就是我现在拥有的,它确实产生了一个散列。但它与我在服务器中的不匹配。在服务器中,这与优化图像到最小缩略图的过程相同。除此之外,还有文件内容($root,$image)位于每个图像处理块的末尾。但我认为问题不在这里,我认为问题可能在于,我在sha1()函数中的$image对象中缺少了一些内容。类似于

这个网站有点像画廊。但要防止重复条目。我想和他们匹配。它不会是100%防弹图像匹配,但对于我的需要,它绝对完美的解决方案

唯一的问题是,我不知道从Imagick
$image
对象获取sha1的正确方法

这就是我现在拥有的,它确实产生了一个散列。但它与我在服务器中的不匹配。在服务器中,这与优化图像到最小缩略图的过程相同。除此之外,还有
文件内容($root,$image)位于每个图像处理块的末尾。但我认为问题不在这里,我认为问题可能在于,我在
sha1()
函数中的
$image
对象中缺少了一些内容。类似于
sha1($image->rendercurrentimage())

只需使用以下命令:

$sha1 = sha1_file($img_url);
但在处理图像之前,请小心获取sha1! 您的所有哈希值都应该根据用户上传的图像生成,这样您就可以将它们与未来图像的哈希值进行比较,而无需首先处理它们

注意!即使重新缩放图像并保持比例,散列也会改变。即使在文本编辑器中打开文件并添加空格,哈希值也会发生变化


将图像缩放到相同宽度的想法可能可行,但前提是使用相同的函数或参数缩放图像。它不是100%可信的。

因为您的问题是,您不想在文件系统中为正在执行的每个步骤创建一个文件,所以我建议您获取这些步骤的blob内容并创建一个散列。例如:

<?php
//quick and dirty image creation to demonstrate my point
$image = new Imagick();
$image->newImage(100, 100, new ImagickPixel('red'));
$image->setImageFormat('png');

//base64 encode our blob and then generate a sha1 hash
$thumbnail = base64_encode( $image->getImageBlob() );
echo sha1($thumbnail);

为什么要这么努力?如果图像真的是一样的,那么就覆盖它。好吧,如果图像是一样的,那么我就不再需要它在系统中了。但是,虽然原始源图像匹配已经对我有所帮助。我还需要匹配缩略图,因为这三重检查将提供更好的结果。如果@Danack是重复的,则可能重复@Danack。我早就有答案了。我的问题与此不同,它涉及的是图像对象。我坚信,这将有助于未来的搜索者。在发布之前,我搜索了几个小时的解决方案——就像我一直做的那样,就像SO指南建议的那样。您使用的库是一个实现细节——理论是一样的。是的,这就是我在第一步中所做的
$source\u hash=sha1\u文件($img\u url)。但我还需要匹配缩放的。编辑到您的编辑:是。基本上,我希望得到一个答案,确认
sha1($image)
是正确的方法,并且您的
文件放置内容($root,$image)向文件中添加了一些内容,但这些内容不匹配。或者我做的$image对象散列有点错误。file\u put\u contents,正如您所看到的,用var$image($image可以是字符串、数组或流资源)的内容重写address$root处的文件。嗯,
sha1($image->getImageBlob())
无论如何都没有给出确切的哈希值。但是我想知道,如果不能散列根文件本身,当它完成时,但是在DB条目之间获取blob。。所以我可以为将来的匹配创造一个完美的条件。回应你的编辑。我知道这个事实。我的问题是,这些图像基本上是相同的,就像我在DB中有20个相同图像的实例一样。但我认为如果我能把缩略图放到正确的哈希表中,它要么证明,这不是必要的,要么会带来更多的结果。总而言之,我需要找出正确处理图像对象的方法。我觉得,你的blob函数可能就是答案。它可能是一个想法,根据你的数据库条目存储每个散列,并在这个过程中获取图像本身的blob内容。如果存储空间不受限制,这可能是一种选择。再次查看代码,可能是您使用的有损格式和模糊导致哈希值发生变化?您是否考虑过在散列过程中使用单独的缩略图生成(例如无损等)我目前正在测试来自db的同一个源文件,而不是它的任何副本。而散列,无论我做什么,都不匹配。我会再进一步测试,但我想这可能不可能,因为我现在这样做。最终创建的完成文件将不同。到目前为止,存储限制还不是问题,如果有什么问题的话,我应该为mysql找到一些可以快速完成的事情,因为它使用了我们可以使用的资源总量的5%
<?php
//quick and dirty image creation to demonstrate my point
$image = new Imagick();
$image->newImage(100, 100, new ImagickPixel('red'));
$image->setImageFormat('png');

//base64 encode our blob and then generate a sha1 hash
$thumbnail = base64_encode( $image->getImageBlob() );
echo sha1($thumbnail);