Perceptual hashing algorithm
Count < = 5 matches most similar
Count > 102 Different pictures
Var_dump (Imagehash::run ('./1.png ', './psb.jpg '));
<?php class Imagehash {Const File_not_found = '-1 ';
Const File_extname_illegal = '-2 ';
Private Function __construct () {} public static function run ($src 1, $src 2) {static $self;
if (! $self) $self = new Static;
if (!is_file ($src 1) | | |!is_file ($SRC 2)) exit (Self::file_not_found);
$hash 1 = $self->gethashvalue ($src 1);
$hash 2 = $self->gethashvalue ($src 2);
if (strlen ($hash 1)!== strlen ($hash 2)) return false;
$count = 0;
$len = strlen ($hash 1);
for ($i = 0; $i < $len; $i + +) if ($hash 1[$i]!== $hash 2[$i]) $count + +; Return $count <= 10?
True:false;
The Public Function GetImage ($file) {$extname = PathInfo ($file, pathinfo_extension);
if (!in_array ($extname, [' jpg ', ' jpeg ', ' png ', ' gif ']) exit (Self::file_extname_illegal); $img = Call_user_func (' Imagecreatefrom '). ($extname = = ' jpg '?
' JPEG ': $extname), $file);
return $img;
The Public Function Gethashvalue ($file) {$w = 8;
$h = 8; $img = Imagecreatetruecolor ($w, $h);
List ($src _w, $src _h) = getimagesize ($file);
$SRC = $this->getimage ($file);
Imagecopyresampled ($img, $src, 0, 0, 0, 0, $w, $h, $src _w, $src _h);
Imagedestroy ($SRC);
$total = 0;
$array = Array (); for ($y = 0; $y < $h; $y + +) {for ($x = 0; $x < $w; $x + +) {$gray = (Imagecolorat ($img, $x, $y) >&G T
8) & 0xFF;
if (!isset ($array [$y])) $array [$y] = array ();
$array [$y] [$x] = $gray;
$total + + $gray;
} Imagedestroy ($IMG);
$average = Intval ($total/($W * $h * 2));
$hash = '; for ($y = 0; $y < $h; $y + +) {for ($x = 0; $x < $w; $x + +) {$hash. = ($array [$y] [$x] >= $average)? '
1 ': ' 0 ';
} var_dump ($hash);
return $hash;
} var_dump (Imagehash::run ('./1.png ', './psb.jpg '));
Method Two:
hash ($f); Return $isString?
$result [0]: $result; The Public Function checkissimilarimg ($imgHash, $otherImgHash) {if (file_exists ($imgHash) && file_exists ($
Otherimghash)) {$imgHash = $this->run ($imgHash);
$otherImgHash = $this->run ($otherImgHash);
} if (strlen ($imgHash)!== strlen ($otherImgHash)) return false;
$count = 0;
$len = strlen ($imgHash);
For ($i =0 $i < $len; $i + +) {if ($imgHash {$i}!== $otherImgHash {$i}) {$count + +; } return $count <= (5 * $rate * $rate)?
True:false;
The Public Function hash ($file) {if (!file_exists ($file)) {return false;
} $height = 8 * $this->rate;
$width = 8 * $this->rate;
$img = Imagecreatetruecolor ($width, $height);
List ($w, $h) = getimagesize ($file);
$source = $this->createimg ($file);
Imagecopyresampled ($img, $source, 0, 0, 0, 0, $width, $height, $w, $h);
$value = $this->gethashvalue ($img);
Imagedestroy ($IMG);
return $value; The Public Function Gethashvalue ($img) {$width = Imagesx ($img);
$height = Imagesy ($img);
$total = 0;
$array = Array (); For ($y =0 $y < $height; $y + +) {for ($x =0; $x < $width; $x + +) {$gray = (Imagecolorat ($img, $x, $y) >> 8) & 0
Xff;
if (!is_array ($array [$y])) {$array [$y] = array ();
$array [$y] [$x] = $gray;
$total + + $gray;
} $average = Intval ($total/($this->rate * $this->rate));
$result = ';
for ($y =0; $y < $height; $y + +) {for ($x =0; $x < $width; $x + +) {if ($array [$y] [$x] >= $average) {$result. = ' 1 ';
}else{$result. = ' 0 ';
}} return $result;
The Public Function createimg ($file) {$ext = $this->getfileext ($file);
if ($ext = = = ' jpeg ') $ext = ' jpg ';
$img = null;
Switch ($ext) {case ' png ': $img = Imagecreatefrompng ($file);
Case ' jpg ': $img = Imagecreatefromjpeg ($file);
Case ' gif ': $img = Imagecreatefromgif ($file);
return $img;
The Public Function Getfileext ($file) {$infos = explode ('. ', $file);
$ext = Strtolower ($infos [Count ($infos)-1]); RetUrn $ext;
}
}
The method is invoked as follows:
Require_once "Imghash.class.php";
$instance = Imghash::getinstance ();
$result = $instance->checkissimilarimg (' chenyin/img_3214.png ', ' chenyin/img_3212.jpg ');
If the $result value is true, 2 pictures are similar, otherwise they are not similar.