在開發圖片搜索或去重功能時,常需要判斷兩張圖片是否相似。現有的 PHP 擴展或 API 可能過於複雜,不符合輕量級項目需求。本文介紹一個基於感知哈希的 ImageHash 類,提供簡單易用的靜態方法,支援多種圖片格式,並可調整採樣率與相似度閾值。
class ImageHash {
public static $rate = 2; // 採樣倍率 1~10,影響縮放尺寸 (8*rate)
public static $similarity = 80; // 相似度閾值 0~100,允許的最大差異百分比
// 內部映射:圖片類型 => GD 開啟函數
private static $_createFunc = [ ... ];
...
}
| 方法 | 用途 |
|---|---|
createImage($filePath) | 根據副檔名/MIME 呼叫對應的 imagecreatefrom* 函數,回傳 GD 資源或 false。 |
hashImage($src) | 對 GD 資源執行縮放、灰度、平均值、哈希生成,回傳 256 字元的 '0'/'1' 字串。 |
hashImageFile($filePath) | 封裝開啟→哈希→銷毀資源,直接由檔案路徑取得哈希值。 |
isHashSimilar($aHash, $bHash) | 計算漢明距離,判斷是否在 $similarity 允許範圍內。 |
isImageFileSimilar($aPath, $bPath) | 一鍵比較兩個圖片檔案是否相似。 |
<?php
require_once 'ImageHash.php';
// 範例 1:先取得哈希再比較
$aHash = ImageHash::hashImageFile('photo1.jpg');
$bHash = ImageHash::hashImageFile('photo2.jpg');
var_dump(ImageHash::isHashSimilar($aHash, $bHash)); // bool(true/false)
// 範例 2:直接比較兩個檔案
var_dump(ImageHash::isImageFileSimilar('photo1.jpg', 'photo2.jpg'));
// 調整靈敏度(可選)
ImageHash::$rate = 3; // 更精細採樣
ImageHash::$similarity = 85; // 更嚴格相似度
?>
ImageHash 類以極簡代碼實用化了感知哈希算法,適合中小型專案快速集成圖片去重、相似推薦等功能。透過調整 $rate 與 $similarity 可在速度與準確度間取得平衡。