background image

php 怎么实现根据图片搜索图片功能

php 怎么实现相似图片的搜索呢?
其中的原理来解释下
1、缩小尺寸。将图片缩小到 8×8 的尺寸,总共 64 个像素。这一步的作用是去除图片的细节,
只保留结构、明暗等基本信息,摒弃不同尺寸、比例带来的图片差异。
2、简化色彩。将缩小后的图片,转为 64 级灰度。也就是说,所有像素点总共只有 64 种颜
色。
3、计算平均值。计算所有 64 个像素的灰度平均值。
4、比较像素的灰度。将每个像素的灰度,与平均值进行比较。大于或等于平均值,记为
1;小于平均值,记为 0。
5、计算哈希值。将上一步的比较结果,组合在一起,就构成了一个 64 位的整数,这就是
这张图片的指纹。组合的次序并不重要,只要保证所有图片都采用同样次序就行了。得到
指纹以后,就可以对比不同的图片,看看 64 位中有多少位是不一样的。
使用代码
hash($f);
        }
        return $isString ? $result[0] : $result;
    }
    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;
    }
    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);