malike 发表于 2018-2-11 11:49:28


            思路
使用图层的方法设计,共需要创建3个图像层
1.底层:最后生成的图像
2.真实用户头像:作为中间层,用户上传的真实头像图片
3.圆形蒙版:作为最上层,在蒙版中绘制圆形,并设置为透明
如图:
http://files.jb51.net/file_images/article/201709/201709180859165.png
代码如下:
主功能类 avatar.class.php

fileName = $fileName;

if(is_array($rgb)){
   $this->rgb = $rgb; //rgb颜色数组 array(255,255,0)
}else{
   //有的人喜欢带#号
   $rgb = trim($rgb, '#');
   //处理缩写形式
   if (strlen($rgb)==3){
    $_tmp = $rgb.$rgb.$rgb.$rgb.$rgb.$rgb;
    $rgb = $_tmp;
   }
   $this->rgb = $this->createRGB($rgb); //16进制值 ffff00
}

$this->size = $size;

$this->($this->fileName);

if(!$this->){
   throw Exception("无法读取图像文件");
}
if(!in_array($this->, array(2,3))){
   //仅允许jpg和png
   throw Exception("图像格式不支持");
}
}

/**
* 显示图像
* Enter description here ...
*/
public function show()
{
header("content-type:image/png");

$shadow = $this->createshadow(); //遮罩图片

//创建一个方形图片
$($this->size, $this->size); //目标图片

switch ($this->){
   case 2:
    $($this->fileName); //原素材图片
    break;
   case 3:
    $($this->fileName); //原素材图片
   default:
    return ;
    break;
}


$realSize = $this->? $this-> : $this->;

imagecopyresized($, $, 0, 0, 0, 0, $this->size, $this->size, $realSize, $realSize);
imagecopymerge($, $shadow, 0, 0, 0, 0, $this->size, $this->size, 100);

//创建图像
imagepng($);

//销毁资源
imagedestroy($);
imagedestroy($);
imagedestroy($shadow);
}

/**
* 创建一个圆形遮罩
* Enter description here ...
* @param array 10进制颜色数组
*/
private function createshadow()
{

$($this->size, $this->size);

imageantialias($img, true); //开启抗锯齿

$color_bg = imagecolorallocate($img, $this->rgb, $this->rgb, $this->rgb); //背景色
$color_fg = imagecolorallocate($img, 0, 0, 0); //前景色,主要用来创建圆形

imagefilledrectangle($img, 0, 0, 200, 200, $color_bg);
imagefilledarc($img, 100, 100, 200, 200, 0, 0, $color_fg, );

imagecolortransparent($img, $color_fg); //将前景色转换为透明


return $img;
}

/**
* 将字符形式16进制串转为10进制
* Enter description here ...
* @param $str
*/
private function getIntFromHexStr($str)
{
$format = '0123456789abcdef';

$sum = 0;

for($i=strlen($str)-1, $c=0, $j=0; $i>=$c; $i--,$j++){
   $index = strpos($format, $str[$i]);//strpos从0计算
   $sum+=$index * pow(16,$j);
}

return $sum;
}

/**
* 将16进制颜色转为10进制颜色值数组(RGB)
* Enter description here ...
* @param $str 16进制串(如:ff9900)
*/
private function createRGB($str)
{
$rgb = array();
if(strlen($str) != 6){
   $rgb[] = 0xff;
   $rgb[] = 0xff;
   $rgb[] = 0xff;
   return $rgb; //默认白色
}

$rgb[] = $this->getIntFromHexStr(substr($str, 0, 2));
$rgb[] = $this->getIntFromHexStr(substr($str, 2, 2));
$rgb[] = $this->getIntFromHexStr(substr($str, 4, 2));

return $rgb;

}
}
页: [1]
查看完整版本: php制作圆形用户头像的实例_自定义封装类源代码