>  기사  >  백엔드 개발  >  PHP 이미지 유사성 코드 예

PHP 이미지 유사성 코드 예

WBOY
WBOY원래의
2016-07-25 08:52:061862검색
  1. /**

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

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

  22. * @access public
  23. * @staticvar int
  24. **/
  25. public static $similarity = 80;
  26. /**圖片類型對應的開啟函數

  27. * @access private
  28. * @staticvar string
  29. **/
  30. private static $_createFunc = array(
  31. IMAGETY >'imageCreateFromGIF',
  32. IMAGETYPE_JPEG=>'imageCreateFromJPEG',
  33. IMAGETYPE_PNG =>'imageCreateFromPNG', IMAGETYPE_XBM = >'imageCreateFromXBM',
  34. );
  35. ;/**從檔案建立圖片

  36. * @param string $filePath 檔案位址路徑
  37. * @return resource 當成功開啟圖片則傳遞圖片 resource ID,失敗則是 false
  38. **/
  39. public static function createImage($filePath){
  40. if(!file_exists($file_exists($文件路徑)){ 返回false; } }
  41. /*判斷檔案類型是否可以開啟*/

  42. $type = exif_imagetype($filePath);
  43. if(!array_key_exists($type,self::$_createFunc ) )){ 返回 false; }
  44. $func = self::$_createFunc[$type];

  45. if(!function_exists($func)){ return false; } } }
  46. return $func($filePath);

  47. }
  48. /**hash 圖片

  49. * @param resource $src 圖片 resource ID
  50. * @return string 圖片 hash 值,失敗則是 false
  51. **/
  52. 公共靜態函數 hashImage( $src){
  53. if(! $src){ 回傳false; }
  54. /* 縮小圖片尺寸*/

  55. $delta = 8 * self::$rate;
  56. $img = imageCreateTrueColor($delta,$delta);
  57. imageCopyResized($img,$src, 0,0 ,0,0, $delta,$delta,imagesX($src),imagesY($src));
  58. /* 計算圖片灰階值*/

  59. $grayArray = array();
  60. for ($y=0; $y for ($x=0; $ x $rgb = imagecolorat($img,$x,$y);
  61. $col = imagecolorsforindex($img, $rgb);
  62. $gray = intval( ($col['紅色'] $col['綠色'] $col['藍色'])/3)& 0xFF;
  63. $grayArray[] = $gray;

  64. }
  65. }
  66. imagedestroy($img);
  67. /*計算所有灰階雛形的像素*/

  68. $average = array_sum($grayArray)/count($grayArray);
  69. /* 計算儲存值*/

  70. $hashStr = '';
  71. foreach ($grayArray as $gray){
  72. $hashStr .= ($gray>=$平均的) ? '1' : '0';
  73. }
  74. return $hashStr;
  75. }
  76. /**hash 圖片檔

  77. * @param string $filePath 檔案位址路徑
  78. * @return string 圖片 hash 值,失敗則是 false
  79. **/
  80. 公用靜態函數 hashImageFile($ filePath){
  81. $src = self::createImage($filePath);
  82. $hashStr = self::hashImage($src);
  83. imagedestroy($src);
  84. 回傳 $hashStr;

  85. }
  86. /**比較兩個hash 值,是不是相似

  87. * @param string $aHash A圖片的hash 值
  88. * @param string $bHash B圖片的hash 值
  89. * @return bool 當圖片相似則傳遞true ,否則是false
  90. **/
  91. 公共靜態函數isHashSimilar($aHash, $bHash){
  92. $aL = strlen($aHash); $bL = strlen($bHash);
  93. if ($aL !== $bL){ return false; }
  94. /* 計算草莓落差的數量*/

  95. $allowGap = $aL*(100-self::$similarity)/100;
  96. /* 計算兩個漢明距離的雜湊值*/

  97. $distance = 0;
  98. for($i=0; $i if ($aHash {$ i} !== $bHash{$i}){ $距離 ; }
  99. }
  100. 回傳($distance

  101. /**두 이미지 파일을 비교하여 유사한지 확인

  102. * @param string $aHash 이미지 A의 경로
  103. * @param string $bHash 이미지 B의 경로
  104. * @return bool 이미지가 다음인 경우 true를 전달합니다. 유사하고, 그렇지 않으면 거짓입니다.
  105. **/
  106. 공개 정적 함수 isImageFileSimilar($aPath, $bPath){
  107. $aHash = ImageHash::hashImageFile($aPath);
  108. $bHash = ImageHash::hashImageFile($bPath);
  109. return ImageHash::isHashSimilar($aHash, $bHash);
  110. }
  111. }

코드 복사


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.