유사 이미지 검색을 위해 PHP에 구현된 API는 제 목적에 별로 적합하지 않기 때문에, 여전히 객체 형태로 패키징되어 있지만 API 구조를 다시 정의하고 비교적 간단한 함수 방식으로 다시 작성했습니다.
/**
* 图image图image可以titude可以
*
* @version $Id: ImageHash.php 4429 2012-04-17 13:20:31Z jax $
* @author jax.hu
*
* <코드>
* //샘플_1
* $aHash = ImageHash::hashImageFile('wsz.11.jpg');
* $bHash = ImageHash::hashImageFile('wsz.12.jpg');
* var_dump(ImageHash::isHashSimilar($aHash, $bHash));
*
* //샘플_2
* var_dump(ImageHash::isImageFileSimilar('wsz.11.jpg', 'wsz.12.jpg'));
* 코드>
*/
클래스 ImageHash {
/**샘플링 레이트 1~10
* @접속 공개
* @staticvar int
**/
공개 정적 $rate = 2;
/**유사성 허용값 0~64
* @접속 공개
* @staticvar int
**/
공개 정적 $ 유사성 = 80;
/**이미지 유형에 해당하는 열기 기능
* @액세스 프라이빗
* @staticvar 문자열
**/
개인 정적 $_createFunc = 배열(
IMAGETYPE_GIF =>'imageCreateFromGIF',
IMAGETYPE_JPEG =>'imageCreateFromJPEG',
IMAGETYPE_PNG =>'imageCreateFromPNG',
IMAGETYPE_BMP =>'imageCreateFromBMP',
IMAGETYPE_WBMP =>'imageCreateFromWBMP',
IMAGETYPE_XBM =>'imageCreateFromXBM',
);
/**파일에서 이미지 생성
* @param string $filePath 파일 주소 경로
* @return 리소스 이미지가 성공적으로 열리면 이미지 리소스 ID가 전달되고, 실패하면 false
**/
공개 정적 함수 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; }
$func($filePath)를 반환합니다.
}
/**해시 이미지
* @param 리소스 $src 이미지 리소스 ID
* @return 문자열 이미지 해시 값, 실패하면 false
**/
공개 정적 함수 hashImage($src){
if(!$src){ false를 반환합니다. }
/*缩小图文尺寸*/
$delta = 8 * self::$rate;
$img = imageCreateTrueColor($delta,$delta);
imageCopyReised($img,$src, 0,0,0,0, $delta,$delta,imagesX($src),imagesY($src));
/*이미지의 회색조 값 계산*/
$grayArray = array();
($y=0; $y<$delta; $y ){
($x=0; $x<$delta; $x ){
$rgb = imagecolorat($img,$x,$y);
$col = imagecolorsforindex($img, $rgb);
$gray = intval(($col['red'] $col['green'] $col['blue'])/3)& 0xFF;
$grayArray[] = $회색
~
~
이미지파괴($img)
/*모든 픽셀의 회색조 평균을 계산합니다*/
$average = array_sum($grayArray)/count($grayArray);
/*해시 값 계산*/
$hashStr = '';
foreach($grayArray를 $gray로){
$hashStr .= ($gray>=$average) ? '1' : '0';
~
$hashStr 반환;
}
/**해시 이미지 파일
* @param string $filePath 파일 주소 경로
* @return 문자열 이미지 해시 값, 실패하면 false
**/
공개 정적 함수 hashImageFile($filePath){
$src = self::createImage($filePath);
$hashStr = self::hashImage($src);
이미지파괴($src)
$hashStr 반환;
}
/**두 개의 해시 값을 비교하여 유사한지 확인하세요
* @param string $aHash A 사진의 해시 값
* @param string $bHash B 사진의 해시값
* @return bool 그림이 유사하면 true를 전달하고, 그렇지 않으면 false를 전달합니다
**/
공개 정적 함수 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<$aL; $i ){
If ($aHash{$i} !== $bHash{$i}){ $distance }
~
반환($distance<=$allowGap) ? true: false;
}
/**두 개의 이미지 파일을 비교하여 유사한지 확인
* @param string $aHash 사진 경로
* @param string $bHash B 사진 경로
* @return bool 그림이 유사하면 true를 전달하고, 그렇지 않으면 false를 전달합니다
* */
공개 정적 함수 isImageFileSimilar($aPath, $bPath){
$aHash = ImageHash::hashImageFile($aPath);
$bHash = ImageHash::hashImageFile($bPath);
return ImageHash::isHashSimilar($aHash, $bHash);
}
}