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 相关文章推荐
服务器web工具 php环境下
Dec 29 PHP
PHP SEO优化之URL优化方法
Apr 21 PHP
解析百度搜索结果link?url=参数分析 (全)
Oct 09 PHP
php header功能的使用
Oct 28 PHP
php 获取SWF动画截图示例代码
Feb 10 PHP
php获取表单中多个同名input元素的值
Mar 20 PHP
php基于CodeIgniter实现图片上传、剪切功能
May 14 PHP
PHP实现的统计数据功能详解
Dec 06 PHP
PHP实现双链表删除与插入节点的方法示例
Nov 11 PHP
php post json参数的传递和接收处理方法
May 31 PHP
Yii Framework框架使用PHPExcel组件的方法示例
Jul 24 PHP
PHP使用递归按层级查找数据的方法
Nov 10 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
PHP5 安装方法
2006/10/09 PHP
php2html php生成静态页函数
2008/12/08 PHP
PHP验证码类代码( 最新修改,完全定制化! )
2010/12/02 PHP
PHP实现自动识别Restful API的返回内容类型
2015/02/07 PHP
在laravel中使用Symfony的Crawler组件分析HTML
2017/06/19 PHP
php-beanstalkd消息队列类实例分享
2017/07/19 PHP
详解阿里云视频直播PHP-SDK接入教程
2020/07/09 PHP
js下弹出窗口的变通
2007/04/18 Javascript
jQuery动态显示和隐藏datagrid中的某一列的方法
2013/12/11 Javascript
jQuery实现的原图对比窗帘效果
2014/06/15 Javascript
JavaScript截取字符串的2个函数介绍
2014/08/27 Javascript
深入理解JavaScript中的箭头函数
2015/07/28 Javascript
使用jQuery.Qrcode插件在客户端动态生成二维码并添加自定义Logo
2016/09/01 Javascript
JavaScript SHA1加密算法实现详细代码
2016/10/06 Javascript
微信小程序 地图定位简单实例
2016/10/14 Javascript
jQuery动态生成表格及右键菜单功能示例
2017/01/13 Javascript
Vant的安装和配合引入Vue.js项目里的方法步骤
2018/12/05 Javascript
layui实现数据表格点击搜索功能
2020/03/26 Javascript
vue中keep-alive,include的缓存问题
2019/11/26 Javascript
JavaScript使用百度ECharts插件绘制饼图操作示例
2019/11/26 Javascript
JavaScript数组常用的增删改查与其他属性详解
2020/10/13 Javascript
[00:37]2016完美“圣”典风云人物:AMS宣传片
2016/12/06 DOTA
使用IPython下的Net-SNMP来管理类UNIX系统的教程
2015/04/15 Python
在Python中实现替换字符串中的子串的示例
2018/10/31 Python
Django文件存储 默认存储系统解析
2019/08/02 Python
Django中create和save方法的不同
2019/08/13 Python
对python中的装包与解包实例详解
2019/08/24 Python
CSS3之2D与3D变换的实现方法
2019/01/28 HTML / CSS
欧舒丹比利时官网:L’OCCITANE比利时
2017/04/25 全球购物
什么情况下你必须要把一个类定义为abstract的
2013/01/06 面试题
个人自我鉴定总结
2014/03/25 职场文书
土建专业毕业生自荐书
2014/07/04 职场文书
呼啸山庄读书笔记
2015/06/29 职场文书
高中语文教材(文学文化常识大全一)
2019/08/13 职场文书
关于企业的执行力标语大全
2020/01/06 职场文书
Javascript设计模式之原型模式详细
2021/10/05 Javascript