此源码有个阈值可以自己调节,精确度等自测
<?php
/*$Colorimg = new Colorimg();
$image=$Colorimg->IMGaction("G:/www/20161220/demo/5.jpg",1,1,50);
//告诉浏览器以图片形式解析
header('content-type:image/jpeg');
imagejpeg($image, "G:/www/20161220/demo/3.jpg");
*/
classColorimg
{
public$image;//图片
private$cs;//比对阈值
publicfunctionIMGaction($imgurl,$if_url=1,$if_deflate=0,$cs='50') {
if($if_url==1) {
$image= $this->ImgcolorCRRATE($imgurl);
}else{
$image= $imgurl;
}
if($if_deflate==1) {
$image= $this->ImgDEFLATE($image);
}
//平均值
$sample= $this->ColorGETMEANrgb($image);
$image=$this->ImgsetPIXEL($image,$sample,$cs);
return$image;
}
/**
* 打开一张图片
*/
publicfunctionImgcolorCRRATE($image)
{
list($width, $height) = getimagesize($image);//获取图片信息
$img_info= getimagesize($image);
switch($img_info[2]) {
case1:
$img= imagecreatefromgif($image);
break;
case2:
$img= imagecreatefromjpeg($image);
break;
case3:
$img= imagecreatefrompng($image);
break;
}
return$img;
}
/**
* $rate为图片长宽最大值
*/
publicfunctionImgDEFLATE($image, $rate= '800')
{
$w= imagesx($image);
$h= imagesy($image);
//指定缩放出来的最大的宽度(也有可能是高度)
$max= $rate;
//根据最大值为300,算出另一个边的长度,得到缩放后的图片宽度和高度
if($w> $h) {
$w= $max;
$h= $h* ($max/ imagesx($image));
} else{
$h= $max;
$w= $w* ($max/ imagesy($image));
}
//声明一个$w宽,$h高的真彩图片资源
$i= imagecreatetruecolor($w, $h);
//关键函数,参数(目标资源,源,目标资源的开始坐标x,y, 源资源的开始坐标x,y,目标资源的宽高w,h,源资源的宽高w,h)
imagecopyresampled($i, $image, 0, 0, 0, 0, $w, $h, imagesx($image), imagesy($image));
return$i;
}
/**
* 传入多维数组n个点计算平均值
*$rgbarrays=array(
* $rgb1=array(
* 'r'=>255,
* 'g'=>255,
* 'b'=>255
* )
* )
*/
publicfunctionColorRECKmean($rgbarrays)
{
//获取总共几个点
$sum= count($rgbarrays);
$mean1['r'] = '';
$mean1['g'] = '';
$mean1['b'] = '';
foreach($rgbarraysas$rbg) {
$mean1['r'] += $rbg['r'];
$mean1['g'] += $rbg['g'];
$mean1['b'] += $rbg['b'];
}
$mean['r'] = intval($mean1['r'] / $sum);
$mean['g'] = intval($mean1['g'] / $sum);
$mean['b'] = intval($mean1['b'] / $sum);
return$mean;
}
/**
* 取四个点,返回平均点的rgb数组
*/
publicfunctionColorGETMEANrgb($image)
{
$rgb1= imagecolorat($image, 0, 0);
$rgb2= imagecolorat($image, 0, imagesy($image) - 1);
$rgb3= imagecolorat($image, imagesx($image) - 1, 0);
$rgb4= imagecolorat($image, imagesx($image) - 1, imagesy($image) - 1);
//平均值
$sample= $this->ColorRECKmean(array($this->ColorRGBresolved($rgb1)), $this->ColorRGBresolved($rgb2), $this->ColorRGBresolved($rgb3), $this->ColorRGBresolved($rgb4));
return$sample;
}
publicfunctionImgsetPIXEL($image,$sample,$cs){
//如果相似就加一个白色的点
for($x= 0; $x< imagesx($image); $x++) {
for($y= 0; $y< imagesy($image); $y++) {
$rgb= imagecolorat($image, $x, $y);
$than= $this->ColorTHANrgb($this->ColorRGBComp($this->ColorRGBresolved($rgb), $sample),$cs);
if($than) {
$color= imagecolorallocate($image, 255, 255, 255);
imagesetpixel($image, $x, $y, $color);
}
}
}
return$image;
}
/**
* 比对颜色相似度
* $rgb1和$rgb2必须数组$rgb['r']....
*/
publicfunctionColorRGBComp($rgb1, $rgb2)
{
$tbsr= abs($rgb1['r'] - $rgb2['r']);
$tbsg= abs($rgb1['g'] - $rgb2['g']);
$tbsb= abs($rgb1['b'] - $rgb2['b']);
$cv= sqrt(pow($tbsr, 2) + pow($tbsg, 2) + pow($tbsb, 2));
return$cv;
}
/**
*把rgb颜色分解成数组
*
*/
functionColorRGBresolved($rgb)
{
$img['r'] = intval(($rgb>> 16) & 0xFF);
$img['g'] = intval(($rgb>> 8) & 0xFF);
$img['b'] = intval(($rgb) & 0xFF);
return$img;
}
/**
* 对比像素是否相似,相似返回true
*/
publicfunctionColorTHANrgb($cv, $cs)
{
if($cv<=$cs) {
returntrue;
} else{
returnfalse;
}
}
}
|