PHP实现搜索相似图片,
感知哈希算法
count
count > 10 两张不同的图片
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($src1, $src2) { static $self; if(!$self) $self = new static; if(!is_file($src1) || !is_file($src2)) exit(self::FILE_NOT_FOUND); $hash1 = $self->getHashValue($src1); $hash2 = $self->getHashValue($src2); if(strlen($hash1) !== strlen($hash2)) return false; $count = 0; $len = strlen($hash1); for($i = 0; $i < $len; $i++) if($hash1[$i] !== $hash2[$i]) $count++; return $count <= 10 ? true : false; } 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; } 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) >> 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'));
方法二:
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); $value = $this->getHashValue($img); imagedestroy($img); return $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; } }
调用方式如下:
require_once "Imghash.class.php"; $instance = ImgHash::getInstance(); $result = $instance->checkIsSimilarImg('chenyin/IMG_3214.png', 'chenyin/IMG_3212.JPG');
如果$result值为true, 则表明2个图片相似,否则不相似。

ThebestapproachforsendingemailsinPHPisusingthePHPMailerlibraryduetoitsreliability,featurerichness,andeaseofuse.PHPMailersupportsSMTP,providesdetailederrorhandling,allowssendingHTMLandplaintextemails,supportsattachments,andenhancessecurity.Foroptimalu

使用依赖注入(DI)的原因是它促进了代码的松耦合、可测试性和可维护性。1)使用构造函数注入依赖,2)避免使用服务定位器,3)利用依赖注入容器管理依赖,4)通过注入依赖提高测试性,5)避免过度注入依赖,6)考虑DI对性能的影响。

phperformancetuningiscialbecapeitenhancesspeedandeffice,whatevitalforwebapplications.1)cachingwithapcureduccureducesdatabaseloadprovesrovesponsemetimes.2)优化

ThebestpracticesforsendingemailssecurelyinPHPinclude:1)UsingsecureconfigurationswithSMTPandSTARTTLSencryption,2)Validatingandsanitizinginputstopreventinjectionattacks,3)EncryptingsensitivedatawithinemailsusingOpenSSL,4)Properlyhandlingemailheaderstoa

TOOPTIMIZEPHPAPPLICITIONSFORPERSTORANCE,USECACHING,数据库imization,opcodecaching和SererverConfiguration.1)InlumentCachingWithApcutCutoredSatfetchTimes.2)优化的atabasesbasesebasesebasesbasesbasesbaysbysbyIndexing,BeallancingAndWriteExing

依赖性注射inphpisadesignpatternthatenhancesFlexibility,可检验性和ManiaginabilybyByByByByByExternalDependencEctenceScoupling.itallowsforloosecoupling,EasiererTestingThroughMocking,andModularDesign,andModularDesign,butquirscarecarefulscarefullsstructoringDovairing voavoidOverOver-Inje

PHP性能优化可以通过以下步骤实现:1)在脚本顶部使用require_once或include_once减少文件加载次数;2)使用预处理语句和批处理减少数据库查询次数;3)配置OPcache进行opcode缓存;4)启用并配置PHP-FPM优化进程管理;5)使用CDN分发静态资源;6)使用Xdebug或Blackfire进行代码性能分析;7)选择高效的数据结构如数组;8)编写模块化代码以优化执行。

opcodecachingsimplovesphperforvesphpermance bycachingCompiledCode,reducingServerLoadAndResponSetimes.1)itstorescompiledphpcodeinmemory,bypassingparsingparsingparsingandcompiling.2)useopcachebachebachebachebachebachebachebysettingparametersinphametersinphp.ini,likeememeryconmorysmorysmeryplement.33)


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

SecLists
SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

安全考试浏览器
Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。

SublimeText3 Linux新版
SublimeText3 Linux最新版

SublimeText3 英文版
推荐:为Win版本,支持代码提示!

Atom编辑器mac版下载
最流行的的开源编辑器