我想将上传的图片与数据库中的所有图片进行比较,如果匹配则应显示匹配图片的详细信息。
我试过这个但是无法理解,任何人都可以帮助不同的人吗?
<?php
class compareImages
{
private function mimeType($i)
{
/*returns array with mime type and if its jpg or png. Returns false if it isn't jpg or png*/
$mime = getimagesize($i);
$return = array($mime[0],$mime[1]);
switch ($mime['mime'])
{
case 'image/jpeg':
$return[] = 'jpg';
return $return;
case 'image/png':
$return[] = 'png';
return $return;
default:
return false;
}
}
private function createImage($i)
{
/*retuns image resource or false if its not jpg or png*/
$mime = $this->mimeType($i);
if($mime[2] == 'jpg')
{
return imagecreatefromjpeg ($i);
}
else if ($mime[2] == 'png')
{
return imagecreatefrompng ($i);
}
else
{
return false;
}
}
private function resizeImage($i,$source)
{
/*resizes the image to a 8x8 squere and returns as image resource*/
$mime = $this->mimeType($source);
$t = imagecreatetruecolor(8, 8);
$source = $this->createImage($source);
imagecopyresized($t, $source, 0, 0, 0, 0, 8, 8, $mime[0], $mime[1]);
return $t;
}
private function colorMeanValue($i)
{
/*returns the mean value of the colors and the list of all pixel's colors*/
$colorList = array();
$colorSum = 0;
for($a = 0;$a<8;$a++)
{
for($b = 0;$b<8;$b++)
{
$rgb = imagecolorat($i, $a, $b);
$colorList[] = $rgb & 0xFF;
$colorSum += $rgb & 0xFF;
}
}
return array($colorSum/64,$colorList);
}
private function bits($colorMean)
{
/*returns an array with 1 and zeros. If a color is bigger than the mean value of colors it is 1*/
$bits = array();
foreach($colorMean[1] as $color){$bits[]= ($color>=$colorMean[0])?1:0;}
return $bits;
}
public function compare($a,$b)
{
/*main function. returns the hammering distance of two images' bit value*/
$i1 = $this->createImage($a);
$i2 = $this->createImage($b);
if(!$i1 || !$i2){return false;}
$i1 = $this->resizeImage($i1,$a);
$i2 = $this->resizeImage($i2,$b);
imagefilter($i1, IMG_FILTER_GRAYSCALE);
imagefilter($i2, IMG_FILTER_GRAYSCALE);
$colorMean1 = $this->colorMeanValue($i1);
$colorMean2 = $this->colorMeanValue($i2);
$bits1 = $this->bits($colorMean1);
$bits2 = $this->bits($colorMean2);
$hammeringDistance = 0;
for($a = 0;$a<64;$a++)
{
if($bits1[$a] != $bits2[$a])
{
$hammeringDistance++;
}
}
return $hammeringDistance;
}
}
?>
答案 0 :(得分:0)
实际上你可以使用前面评论中提到的md5文件,或者你可以将图像转换为base64字符串并在base64字符串之间进行比较。 如果你有两个相同的图像,base64string将返回相同的模式
祝你好运答案 1 :(得分:0)
试试这个:也许有帮助
<?php
$sourceImagepath = encodeImage("folder/source.png");
$uploadedImagepath = encodeImage("temp/uploded.png");
if(areEqual($sourceImagepath , $uploadedImagepath)){
echo "Image is already Exist";
return false;
}
echo "Image Upload";
function encodeImage($ImagePath){
$ext = pathinfo($ImagePath, PATHINFO_EXTENSION);
$Imgcontent = file_get_contents($ImagePath);
$base64 = 'data:image/' . $ext . ';base64,' . base64_encode($Imgcontent);
return $base64;
}
function areEqual($sourceImage, $uploadedImage){
if (strcmp($sourceImage, $uploadedImage) !== 0) {
return false;
}
return true;
}
?>
OR
<?php
function areEqual($firstPath, $secondPath, $chunkSize = 500){
// First check if file are not the same size as the fastest method
if(filesize($firstPath) !== filesize($secondPath)){
return false;
}
// Compare the first ${chunkSize} bytes
// This is fast and binary files will most likely be different
$fp1 = fopen($firstPath, 'r');
$fp2 = fopen($secondPath, 'r');
$chunksAreEqual = fread($fp1, $chunkSize) == fread($fp2, $chunkSize);
fclose($fp1);
fclose($fp2);
if(!$chunksAreEqual){
return false;
}
// Compare hashes
// SHA1 calculates a bit faster than MD5
$firstChecksum = sha1_file($firstPath);
$secondChecksum = sha1_file($secondPath);
if($firstChecksum != $secondChecksum){
return false;
}
return true;
}
?>