由于相似圖檔搜尋的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