【问题标题】:How to get sha1 hash from Imagick object?如何从 Imagick 对象中获取 sha1 哈希?
【发布时间】:2014-09-03 10:48:19
【问题描述】:

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

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

这就是我现在所拥有的,它确实会产生一个哈希值。但它与我在服务器中的那些不匹配。在服务器中,将图像优化到最小的缩略图的过程相同。除此之外,每个图像处理块的末尾都有file_put_contents($root, $image);。但我认为问题不存在,我认为问题可能在于我在sha1() 函数内的$image 对象中遗漏了一些东西。比如sha1($image->rendercurrentimage())..

<?
$img_url = 'someimgfile.jpg';

# Step 1 = Original file hash - This is all ok
$source_hash = sha1_file($img_url);

$image = new Imagick($img_url);
# file_put_contents($source_root, $image);

$image->gaussianBlurImage(0, 0.05);
$image->setCompression(Imagick::COMPRESSION_JPEG);
$image->setCompressionQuality(90);
$image->setImageFormat('jpeg');
$image->scaleImage(215, 0);
# file_put_contents($thumbnail_root, $image);

# Step 2 = Get the thumbnail hash - results in a non matching hash vs. DB hash
$thumbnail_hash = sha1($image);

$image->setCompressionQuality(75); 
$image->cropThumbnailImage(102, 102);
# file_put_contents($smallthumbnail_root, $image);

# Step 3 = Get the even smaller thumbnail hash - results in a non matching hash vs. DB hash
$smallthumbnail_hash = sha1($image);

# now query to DB to check against all 3 hashes: $source_hash | $thumbnail_hash | $smallthumbnail_hash
# DB has lets say 1000 images, with source hash, thumbnail hash and small thumbnail hash saved in them

# NOTE: The process of scaling images as they enter the DB, is exactly the same, expect there are file_put_contents($root, $image); in between them.. I put them in and commented out, to show you the locations

正如我上面所说的。我在服务器中有 3 种方式的匹配哈希。如此原始,缩略图甚至更小的缩略图。这些是使用sha1_file() 函数创建的。我想基本上模仿洞的过程,但不要将文件保存在 $root 中,以防它重复并且那里将被拒绝并重定向到匹配的条目。

如果您想知道,我为什么要匹配缩略图。这是因为,我的测试表明,如果原始文件的大小可能不同等。然后创建的缩略图匹配得很好。还是我错了?如果我有相同的图像,有 3 种不同的尺寸。我将它们缩小到 100px 宽度。它们的哈希值是否相同?

结论 我不得不稍微重写原始图像处理程序。但基本上我认为我的代码中仍然缺少一块,例如$image-&gt;stripImage();。或者其他的东西。虽然它开始获得更好的结果。将哈希值保存在服务器中的最佳方法似乎是:

$hash = sha1(base64_encode($image-&gt;getImageBlob()));

我的测试也证实,file_put_contents($thumbnail_root, $image); 然后通过sha1_file($image_root); 获取哈希值不会改变哈希值。

我还从缩小到拇指大小的较大图像中获得了更多匹配结果。

【问题讨论】:

  • 为什么要努力?如果图像真的是相同,那么只需覆盖它。
  • 好吧,如果图像是一样的,那我就不需要它了。但是,虽然原始源图像匹配已经对我有所帮助。我还需要匹配缩略图,因为这个三重检查会得到更好的结果。
  • @Danack,如果它是重复的。我已经有了答案。我的问题是不同的,涉及想象的对象。我坚信,这将在未来帮助搜索者。在发布之前,我花了几个小时寻找解决方案——就像我一直做的那样,正如 SO 指南所建议的那样。
  • 你使用的库是一个实现细节——理论是一样的。

标签: php sha1 imagick


【解决方案1】:

由于您的问题是您不想在文件系统上为您正在经历的每个步骤创建一个文件,因此我建议您获取这些步骤的 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);

如果您尝试将两个不同(原始)大小的图像相互匹配,那么您可能会遇到重采样问题。例如我有一张 200px 正方形的猴子图片,另一张看似相同的 400px 正方形,如果我重新采样到 200px,图像将不会总是匹配。

【讨论】:

  • 有趣的想法。好吧,sha1($image-&gt;getImageBlob()) 并没有给出确切的哈希值。但是我想知道,如果不能在完成时对根文件本身进行哈希处理,但是在数据库条目之间获取 blob。所以我可以为将来的匹配创造一个完美的条件。
  • 回应您的编辑。我知道这个事实。我的问题是,图像基本相同,就像我在数据库中有 20 个相同图像的实例。但我认为,如果我能得到正确哈希的缩略图,它要么证明它没有必要,要么它会带来更多结果。总而言之,我需要找出正确 sha1 一个想象对象的方法。我觉得,你的 blob 函数可能就是答案。
  • 将每个哈希值存储在您的数据库条目中并在此过程中获取图像本身的 blob 内容可能是一个想法。如果存储空间不受限制,这可能是一种选择。
  • 再次查看您的代码可能是您使用的有损格式和模糊导致哈希发生变化?您是否考虑过为散列过程测试使用单独的缩略图生成(例如无损等)
  • 我目前正在测试来自 db 的完全相同的源文件,而不是它的任何副本。和哈希,无论我做什么,都不匹配。我将进一步测试,但我想这可能是不可能的,因为我现在正在这样做。最后完成的创建文件会有所不同。到目前为止,存储限制不是问题,如果有的话,我应该为 mysql 找到一些快速做的事情,因为它使用了我们可以使用的资源的 5%:S
【解决方案2】:

就用这个吧:

$sha1 = sha1_file($img_url);

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

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

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

【讨论】:

  • 是的,这就是我在第一步中所做的$source_hash = sha1_file($img_url);。但我还需要匹配缩放的。
  • 编辑您的编辑:是的。我基本上希望得到一个答案,确认sha1($image) 是正确的方法,而你的file_put_contents($root, $image); 在文件中添加了一些内容,因为它们不匹配。或者我做 $image 对象以某种方式散列错误。
  • file_put_contents,正如你所拥有的,用 var $image 的内容重写地址 $root 处的文件($image 可以是字符串、数组或流资源)
猜你喜欢
  • 2016-10-12
  • 2023-03-04
  • 2010-12-19
  • 2015-02-05
  • 2011-02-04
  • 2011-10-22
  • 2018-08-03
  • 2011-03-11
  • 1970-01-01
相关资源
最近更新 更多