php制作圆形用户头像的实例_自定义封装类源代码


Posted in PHP onSeptember 18, 2017

思路

使用图层的方法设计,共需要创建3个图像层

1.底层:最后生成的图像

2.真实用户头像:作为中间层,用户上传的真实头像图片

3.圆形蒙版:作为最上层,在蒙版中绘制圆形,并设置为透明

如图:

php制作圆形用户头像的实例_自定义封装类源代码

代码如下:

主功能类 avatar.class.php

<?php
class avatar
{
 private $fileName; //文件的绝对路径(或基于最终调用文件的相对路径)
 private $rgb; //颜色索引(数组 array(255,255,0) 或 16进制值 ffff00/#ffff00/ff0/#ff0)
 private $size; //图像大小
 private $imgInfo; //图像信息
 
 /**
  * 初始化
  * Enter description here ...
  * @param string $fileName 文件的绝对路径(或基于最终调用文件的相对路径)
  * @param mixed $rgb 颜色索引(数组 array(255,255,0) 或 16进制值 ffff00/#ffff00/ff0/#ff0)
  * @param int $size 图像大小
  */
 public function __construct($fileName, $rgb, $size)
 {
  $this->fileName = $fileName;
  
  if(is_array($rgb)){
   $this->rgb = $rgb; //rgb颜色数组 array(255,255,0)
  }else{
   //有的人喜欢带#号
   $rgb = trim($rgb, '#');
   //处理缩写形式
   if (strlen($rgb)==3){
    $_tmp = $rgb[0].$rgb[0].$rgb[1].$rgb[1].$rgb[2].$rgb[2];
    $rgb = $_tmp;
   }
   $this->rgb = $this->createRGB($rgb); //16进制值 ffff00
  }
  
  $this->size = $size;
  
  $this->imgInfo = getimagesize($this->fileName);
  
  if(!$this->imgInfo){
   throw Exception("无法读取图像文件");
  }
  if(!in_array($this->imgInfo[2], array(2,3))){
   //仅允许jpg和png
   throw Exception("图像格式不支持");
  }
 }
 
 /**
  * 显示图像
  * Enter description here ...
  */
 public function show()
 {
  header("content-type:image/png");
  
  $shadow = $this->createshadow(); //遮罩图片
  
  //创建一个方形图片
  $imgbk = imagecreatetruecolor($this->size, $this->size); //目标图片
  
  switch ($this->imgInfo[2]){
   case 2:
    $imgfk = imagecreatefromjpeg($this->fileName); //原素材图片
    break;
   case 3:
    $imgfk = imagecreatefrompng($this->fileName); //原素材图片
   default:
    return ;
    break;
  }
  
  
  $realSize = $this->imgInfo[0]<$this->imgInfo[1]? $this->imgInfo[0] : $this->imgInfo[1];
  
  imagecopyresized($imgbk, $imgfk, 0, 0, 0, 0, $this->size, $this->size, $realSize, $realSize);
  imagecopymerge($imgbk, $shadow, 0, 0, 0, 0, $this->size, $this->size, 100);
  
  //创建图像
  imagepng($imgbk);
  
  //销毁资源
  imagedestroy($imgbk);
  imagedestroy($imgfk);
  imagedestroy($shadow);
 }
 
 /**
  * 创建一个圆形遮罩
  * Enter description here ...
  * @param array 10进制颜色数组
  */
 private function createshadow()
 {
  
  $img = imagecreatetruecolor($this->size, $this->size);
  
  imageantialias($img, true); //开启抗锯齿
  
  $color_bg = imagecolorallocate($img, $this->rgb[0], $this->rgb[1], $this->rgb[2]); //背景色
  $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, IMG_ARC_PIE);
  
  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;
  
 }
}

以上这篇php制作圆形用户头像的实例_自定义封装类源代码就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
php ios推送(代码)
Jul 01 PHP
解析php根据ip查询所在地区(非常有用,赶集网就用到)
Jul 01 PHP
提高PHP编程效率的方法
Nov 07 PHP
php获取远程图片体积大小的实例
Nov 12 PHP
phpQuery占用内存过多的处理方法
Nov 13 PHP
php动态生成函数示例
Mar 21 PHP
ThinkPHP实现事务回滚示例代码
Jun 23 PHP
详解PHP导入导出CSV文件
Nov 03 PHP
PHP计算加权平均数的方法
Jul 16 PHP
smarty简单应用实例
Nov 03 PHP
浅谈php中变量的数据类型判断函数
Mar 04 PHP
Laravel实现搜索的时候分页并携带参数
Oct 15 PHP
PHP中使用jQuery+Ajax实现分页查询多功能操作(示例讲解)
Sep 17 #PHP
PHP实现深度优先搜索算法(DFS,Depth First Search)详解
Sep 16 #PHP
PHP实现广度优先搜索算法(BFS,Broad First Search)详解
Sep 16 #PHP
PHP实现的迪科斯彻(Dijkstra)最短路径算法实例
Sep 16 #PHP
PHP环形链表实现方法示例
Sep 15 #PHP
PHP实现的链式队列结构示例
Sep 15 #PHP
PHP基于堆栈实现的高级计算器功能示例
Sep 15 #PHP
You might like
利用js调用后台php进行数据处理原码
2006/10/09 PHP
php登录超时检测功能实例详解
2017/03/21 PHP
PHP使用xpath解析XML的方法详解
2017/05/20 PHP
JS IE和FF兼容性问题汇总
2009/02/09 Javascript
利用谷歌地图API获取点与点的距离的js代码
2012/10/11 Javascript
jquery如何改变html标签的样式(两种实现方法)
2013/01/16 Javascript
简易js代码实现计算器操作
2013/04/15 Javascript
js的for in循环和java里foreach循环的区别分析
2015/01/28 Javascript
JS中产生标识符方式的演变
2015/06/12 Javascript
JavaScript的设计模式经典之代理模式
2016/02/24 Javascript
H5图片压缩与上传实例
2017/04/21 Javascript
vuex actions传递多参数的处理方法
2018/09/18 Javascript
tweenjs缓动算法的使用实例分析
2019/08/26 Javascript
Vue修改项目启动端口号方法
2019/11/07 Javascript
vant picker+popup 自定义三级联动案例
2020/11/04 Javascript
python在指定目录下查找gif文件的方法
2015/05/04 Python
Python实现豆瓣图片下载的方法
2015/05/25 Python
Python实现两个list对应元素相减操作示例
2017/06/09 Python
详解windows python3.7安装numpy问题的解决方法
2018/08/13 Python
Python 创建新文件时避免覆盖已有的同名文件的解决方法
2018/11/16 Python
Python安装及Pycharm安装使用教程图解
2019/09/20 Python
使用Python实现正态分布、正态分布采样
2019/11/20 Python
关于Tensorflow 模型持久化详解
2020/02/12 Python
matplotlib quiver箭图绘制案例
2020/04/17 Python
keras 两种训练模型方式详解fit和fit_generator(节省内存)
2020/07/03 Python
纯css3使用vw和vh实现自适应的方法
2018/02/09 HTML / CSS
领导失职检讨书
2014/02/24 职场文书
调查研究项目计划书
2014/04/29 职场文书
市级青年文明号申报材料
2014/05/26 职场文书
党员志愿者活动方案
2014/08/28 职场文书
党支部四风整改方案
2014/10/25 职场文书
2014年民政工作总结
2014/11/26 职场文书
2015年国庆节演讲稿范文
2015/07/30 职场文书
大学生军训感言
2015/08/01 职场文书
创业计划书详解
2019/07/19 职场文书
坚持不是死撑,更重要的是心态
2019/08/19 职场文书