使用PHP比较两个图像

时间:2016-12-06 11:11:12

标签: php

我想将上传的图片与数据库中的所有图片进行比较,如果匹配则应显示匹配图片的详细信息。

我试过这个但是无法理解,任何人都可以帮助不同的人吗?

<?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;
    }
}
?>

2 个答案:

答案 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;
    }
    ?>