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 相关文章推荐
用Apache反向代理设置对外的WWW和文件服务器
Oct 09 PHP
PHP去除数组中重复的元素并按键名排序函数
Aug 18 PHP
一些被忽视的PHP函数(简单整理)
Apr 30 PHP
在Windows系统上安装PHP运行环境文字教程
Jul 19 PHP
php数据库连接时容易出错的特殊符号问题
Sep 01 PHP
hadoop中一些常用的命令介绍
Jun 19 PHP
php GUID生成函数和类
Mar 10 PHP
thinkphp实现面包屑导航(当前位置)例子分享
May 10 PHP
php模拟服务器实现autoindex效果的方法
Mar 10 PHP
PHP编写登录验证码功能 附调用方法
May 19 PHP
PHP 匿名函数与注意事项详细介绍
Nov 26 PHP
php删除数组指定元素实现代码
May 03 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
PHP.MVC的模板标签系统(一)
2006/09/05 PHP
一些PHP写的小东西
2006/12/06 PHP
PHP设计模式 注册表模式(多个类的注册)
2012/02/05 PHP
实现PHP框架系列文章(6)mysql数据库方法
2016/03/04 PHP
PHPStudy下如何为Apache安装SSL证书的方法步骤
2019/01/23 PHP
JQUERY操作JSON实例代码
2010/02/09 Javascript
js动态修改整个页面样式达到换肤效果
2014/05/23 Javascript
用javascript读取xml文件读取节点数据
2014/08/12 Javascript
jQuery实现简单的列表式导航菜单效果代码
2015/08/31 Javascript
JS实现全屏的四种写法
2016/12/30 Javascript
js中new一个对象的过程
2017/02/20 Javascript
nodejs acl的用户权限管理详解
2018/03/14 NodeJs
JS实现根据指定值删除数组中的元素操作示例
2018/08/02 Javascript
angular学习之动态创建表单的方法
2018/12/07 Javascript
jQuery实现的简单歌词滚动功能示例
2019/01/07 jQuery
实例分析编写vue组件方法
2019/02/12 Javascript
通过vue手动封装on、emit、off的代码详解
2019/05/29 Javascript
在vue-cli中引入lodash.js并使用详解
2019/11/13 Javascript
[53:15]2018DOTA2亚洲邀请赛3月29日 小组赛A组 KG VS OG
2018/03/30 DOTA
[48:20]OpTic vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
跟老齐学Python之有点简约的元组
2014/09/24 Python
Python 给屏幕打印信息加上颜色的实现方法
2019/04/24 Python
淘宝秒杀python脚本 扫码登录版
2019/09/19 Python
python传到前端的数据,双引号被转义的问题
2020/04/03 Python
纽约服装和生活方式品牌:Saturdays NYC
2017/08/13 全球购物
日本著名化妆品零售网站:Cosme Land
2019/03/01 全球购物
历史学专业推荐信
2013/11/06 职场文书
创业资金计划书
2014/02/06 职场文书
施工材料员岗位职责
2014/02/12 职场文书
机修工工作职责
2014/02/21 职场文书
《跨越海峡的生命桥》教学反思
2014/02/24 职场文书
食品科学与工程专业毕业生求职信范文
2014/07/21 职场文书
连锁超市项目计划书
2014/09/15 职场文书
酒店前台辞职书
2015/02/26 职场文书
Python实现随机生成迷宫并自动寻路
2021/06/13 Python
HTML5页面音频自动播放的实现方式
2021/06/21 HTML / CSS