欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

php比较图片相似度代码示例

程序员文章站 2022-05-05 20:18:05
...
  1. /**

  2. * 图片相似度比较
  3. *
  4. * @version $Id: ImageHash.php 4429 2012-04-17 13:20:31Z jax $
  5. * @authorjax.hu
  6. * www.osxue.com
  7. *//Sample_1
  8. *$aHash = ImageHash::hashImageFile('wsz.11.jpg');
  9. *$bHash = ImageHash::hashImageFile('wsz.12.jpg');
  10. *var_dump(ImageHash::isHashSimilar($aHash, $bHash));
  11. *
  12. *//Sample_2
  13. *var_dump(ImageHash::isImageFileSimilar('wsz.11.jpg', 'wsz.12.jpg'));
  14. *
  15. */
  16. class ImageHash {

  17. /**取样倍率 1~10
  18. * @access public
  19. * @staticvar int
  20. * */
  21. public static $rate = 2;
  22. /**相似度允许值 0~64

  23. * @access public
  24. * @staticvar int
  25. * */
  26. public static $similarity = 80;
  27. /**图片类型对应的开启函数

  28. * @access private
  29. * @staticvar string
  30. * */
  31. private static $_createFunc = array(
  32. IMAGETYPE_GIF =>'imageCreateFromGIF',
  33. IMAGETYPE_JPEG=>'imageCreateFromJPEG',
  34. IMAGETYPE_PNG =>'imageCreateFromPNG',
  35. IMAGETYPE_BMP =>'imageCreateFromBMP',
  36. IMAGETYPE_WBMP=>'imageCreateFromWBMP',
  37. IMAGETYPE_XBM =>'imageCreateFromXBM',
  38. );
  39. /**从文件建立图片

  40. * @param string $filePath 文件地址路径
  41. * @return resource 当成功开启图片则传递图片 resource ID,失败则是 false
  42. * */
  43. public static function createImage($filePath){
  44. if(!file_exists($filePath)){ return false; }
  45. /*判断文件类型是否可以开启*/

  46. $type = exif_imagetype($filePath);
  47. if(!array_key_exists($type,self::$_createFunc)){ return false; }
  48. $func = self::$_createFunc[$type];

  49. if(!function_exists($func)){ return false; }
  50. return $func($filePath);

  51. }
  52. /**hash 图片

  53. * @param resource $src 图片 resource ID
  54. * @return string 图片 hash 值,失败则是 false
  55. * */
  56. public static function hashImage($src){
  57. if(!$src){ return false; }
  58. /*缩小图片尺寸*/

  59. $delta = 8 * self::$rate;
  60. $img = imageCreateTrueColor($delta,$delta);
  61. imageCopyResized($img,$src, 0,0,0,0, $delta,$delta,imagesX($src),imagesY($src));
  62. /*计算图片灰阶值*/

  63. $grayArray = array();
  64. for ($y=0; $y for ($x=0; $x $rgb = imagecolorat($img,$x,$y);
  65. $col = imagecolorsforindex($img, $rgb);
  66. $gray = intval(($col['red']+$col['green']+$col['blue'])/3)& 0xFF;
  67. $grayArray[] = $gray;

  68. }
  69. }
  70. imagedestroy($img);
  71. /*计算所有像素的灰阶平均值*/

  72. $average = array_sum($grayArray)/count($grayArray);
  73. /*计算 hash 值*/

  74. $hashStr = '';
  75. foreach ($grayArray as $gray){
  76. $hashStr .= ($gray>=$average) ? '1' : '0';
  77. }
  78. return $hashStr;
  79. }
  80. /**hash 图片文件

  81. * @param string $filePath 文件地址路径
  82. * @return string 图片 hash 值,失败则是 false
  83. * */
  84. public static function hashImageFile($filePath){
  85. $src = self::createImage($filePath);
  86. $hashStr = self::hashImage($src);
  87. imagedestroy($src);
  88. return $hashStr;

  89. }
  90. /**比较两个 hash 值,是不是相似

  91. * @param string $aHash A图片的 hash 值
  92. * @param string $bHash B图片的 hash 值
  93. * @return bool 当图片相似则传递 true,否则是 false
  94. * */
  95. public static function isHashSimilar($aHash, $bHash){
  96. $aL = strlen($aHash); $bL = strlen($bHash);
  97. if ($aL !== $bL){ return false; }
  98. /*计算容许落差的数量*/

  99. $allowGap = $aL*(100-self::$similarity)/100;
  100. /*计算两个 hash 值的汉明距离*/

  101. $distance = 0;
  102. for($i=0; $i if ($aHash{$i} !== $bHash{$i}){ $distance++; }
  103. }
  104. return ($distance }

  105. /**比较两个图片文件,是不是相似

  106. * @param string $aHash A图片的路径
  107. * @param string $bHash B图片的路径
  108. * @return bool 当图片相似则传递 true,否则是 false
  109. * */
  110. public static function isImageFileSimilar($aPath, $bPath){
  111. $aHash = ImageHash::hashImageFile($aPath);
  112. $bHash = ImageHash::hashImageFile($bPath);
  113. return ImageHash::isHashSimilar($aHash, $bHash);
  114. }
  115. }
复制代码