<?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
<
$delta
;
$y
++){
for
(
$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
[] =
$gray
;
}
}
imagedestroy(
$img
);
$average
=
array_sum
(
$grayArray
)/
count
(
$grayArray
);
$hashStr
=
''
;
foreach
(
$grayArray
as
$gray
){
$hashStr
.= (
$gray
>=
$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
<
$aL
;
$i
++){
if
(
$aHash
{
$i
} !==
$bHash
{
$i
}){
$distance
++; }
}
return
(
$distance
<=
$allowGap
) ? true : false;
}
public
static
function
isImageFileSimilar(
$aPath
,
$bPath
){
$aHash
= ImageHash::hashImageFile(
$aPath
);
$bHash
= ImageHash::hashImageFile(
$bPath
);
return
ImageHash::isHashSimilar(
$aHash
,
$bHash
);
}
}