此源码有个阈值可以自己调节,精确度等自测
<?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");
*/
class Colorimg
{
public $image ; //图片
private $cs ; //比对阈值
public function IMGaction( $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 ;
}
/**
* 打开一张图片
*/
public function ImgcolorCRRATE( $image )
{
list( $width , $height ) = getimagesize ( $image ); //获取图片信息
$img_info = getimagesize ( $image );
switch ( $img_info [2]) {
case 1:
$img = imagecreatefromgif( $image );
break ;
case 2:
$img = imagecreatefromjpeg( $image );
break ;
case 3:
$img = imagecreatefrompng( $image );
break ;
}
return $img ;
}
/**
* $rate为图片长宽最大值
*/
public function ImgDEFLATE( $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
* )
* )
*/
public function ColorRECKmean( $rgbarrays )
{
//获取总共几个点
$sum = count ( $rgbarrays );
$mean1 [ 'r' ] = '' ;
$mean1 [ 'g' ] = '' ;
$mean1 [ 'b' ] = '' ;
foreach ( $rgbarrays as $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数组
*/
public function ColorGETMEANrgb( $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 ;
}
public function ImgsetPIXEL( $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']....
*/
public function ColorRGBComp( $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颜色分解成数组
*
*/
function ColorRGBresolved( $rgb )
{
$img [ 'r' ] = intval (( $rgb >> 16) & 0xFF);
$img [ 'g' ] = intval (( $rgb >> 8) & 0xFF);
$img [ 'b' ] = intval (( $rgb ) & 0xFF);
return $img ;
}
/**
* 对比像素是否相似,相似返回true
*/
public function ColorTHANrgb( $cv , $cs )
{
if ( $cv <= $cs ) {
return true;
} else {
return false;
}
}
}
|