天天看點

php 圖檔相似度對比算法,PHP實作的簡易版圖檔相似度比較

由于相似圖檔搜尋的php實作的 API 不怎麼符合我的用途,是以我重新定義 API 的架構,改寫成比較簡單的函數方式,雖然還是用對象的方式包裝。複制代碼 代碼如下:<?php             class ImageHash {                  public static $rate = 2;                  public static $similarity = 80;                  private static $_createFunc = array(           IMAGETYPE_GIF   =>"imageCreateFromGIF",           IMAGETYPE_JPEG  =>"imageCreateFromJPEG",           IMAGETYPE_PNG   =>"imageCreateFromPNG",           IMAGETYPE_BMP   =>"imageCreateFromBMP",           IMAGETYPE_WBMP  =>"imageCreateFromWBMP",           IMAGETYPE_XBM   =>"imageCreateFromXBM",       );                      public static function createImage($filePath){           if(!file_exists($filePath)){ return false; }                          $type = exif_imagetype($filePath);           if(!array_key_exists($type,self::$_createFunc)){ return false; }               $func = self::$_createFunc[$type];           if(!function_exists($func)){ return false; }               return $func($filePath);       }                      public static function hashImage($src){           if(!$src){ return false; }                          $delta = 8 * self::$rate;           $img = imageCreateTrueColor($delta,$delta);           imageCopyResized($img,$src, 0,0,0,0, $delta,$delta,imagesX($src),imagesY($src));                          $grayArray = array();           for ($y=0; $y=$average) ? "1" : "0";           }               return $hashStr;       }                      public static function hashImageFile($filePath){           $src = self::createImage($filePath);           $hashStr = self::hashImage($src);           imagedestroy($src);               return $hashStr;       }                      public static function isHashSimilar($aHash, $bHash){           $aL = strlen($aHash); $bL = strlen($bHash);           if ($aL !== $bL){ return false; }                          $allowGap = $aL*(100-self::$similarity)/100;                          $distance = 0;           for($i=0; $i