class ImagesList { private $rate = 3; 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 $this->getBin2hex($value); } 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 ) & 0xFF; if (!is_array($array[$y])){ $array[$y] = array(); } $array[$y][$x] = $gray; $total += $gray; } } $average = intval($total / (64 * $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; } public function createImg($file){ $ext = $this->getFileExt($file); if ($ext === 'jpeg') $ext = 'jpg'; $img = null; switch ($ext){ case 'png' : $img = imagecreatefrompng($file);break; case 'jpg' : $img = imagecreatefromjpeg($file);break; case 'gif' : $img = imagecreatefromgif($file); } return $img; } public function getFileExt($file){ $infos = explode('.', $file); $ext = strtolower($infos[count($infos) - 1]); return $ext; } public function getBin2hex($str,$len = '4'){ $string = ''; $time = ceil(strlen($str)/$len); for($i=0;$i<$time;$i++){ $start = $i*4; $string .= dechex(bindec(substr($str,$start,$len))); } return $string; } }