php的GD库实例1=图片转素描

图片转素描这种技术,我们了解gd库的基础练习,使用场景比较少,但是会的话,总会让你在更多场合出彩;为我们的技术打下基础

$image_path = "1.jpg";

// $image_path="2.png";
$im_gray = imagecreatefromjpeg($image_path);
 
$width = imagesx($im_gray);
$height = imagesy($im_gray);
//对图像使用过滤器 
imagefilter($im_gray, IMG_FILTER_GRAYSCALE);
 //用于创建画布
$im_invert = imagecreatetruecolor($width, $height);
//在画布中绘制图像
imagecopy($im_invert, $im_gray, 0, 0, 0, 0, $width, $height);
//对图像使用过滤器 
imagefilter($im_invert, IMG_FILTER_NEGATE);
imagefilter($im_invert, IMG_FILTER_GAUSSIAN_BLUR);
  //这个算法最后再给出
$image = color_dodge_blend($im_gray, $im_invert, $width, $height);
 
header('Content-Type: image/jpeg');
//设置图片类型,同样如果想生成gif或者png图象,要替换成相应的头
imagejpeg($image);
//输出图象,如果是gif就用imagegif,如果是png就用imagepng……
imagedestroy($image); 
 function color_dodge($mask, $image)
{
      $GAUSS_COUNT = 10;
  $COLOR_STEP = 30;
	$result = ($image === 255) ? $image : min(255, (($mask << 8 ) / (255 - $image)));
	//$result = ($result <= 210) ? 0 : $result;
// 		var_dump($result,$COLOR_STEP);die;
	$result = (int) ($result / $COLOR_STEP) * $GAUSS_COUNT;

	return $result;
}
 
 function kmax1($array)
{
	return array_search(max($array), $array);
}
 
  function color_dodge_blend($source, $layer, $width, $height)
{
 //用于创建画布
	$image = imagecreatetruecolor($width, $height);
	$color_array = array();
	for ($x = 0; $x < $width; $x++)
	{
		for ($y = 0; $y < $height; $y++)
		{
		//计算灰度
			$rgb = ImageColorAt($source, $x, $y);
			$r = ($rgb >> 16) & 0xFF;
			$g = ($rgb >> 8) & 0xFF;
			$b = $rgb & 0xFF;
 
			$rgb2 = ImageColorAt($layer, $x, $y);
			$r2 = ($rgb2 >> 16) & 0xFF;
			$g2 = ($rgb2 >> 8) & 0xFF;
			$b2 = $rgb2 & 0xFF;
 
			$r = color_dodge($r, $r2);
			$g = color_dodge($g, $g2);
			$b = color_dodge($b, $b2);
 			
			$rgb = ($r << 16) | ($g << 8) | $b;
			$color_array[$rgb] = key_exists($rgb, $color_array) ? $color_array[$rgb] + 1 : 1;
			//在指定的坐标处绘制像素。
			imagesetpixel($image, $x, $y, $rgb);
		}
	}
 
	$background = kmax1($color_array);
 
	for ($x = 0; $x < $width; $x++)
	{
		for ($y = 0; $y < $height; $y++)
		{
		//获取颜色
			$rgb = ImageColorAt($image, $x, $y);
			if ($rgb === $background)
			{
					//在指定的坐标处绘制像素。
			    	imagesetpixel($image, $x, $y, 0xFFFFFF);
			}
		}
	}
 
	return $image;
}
复制代码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享