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系统流量分析的程序
Oct 09 PHP
Zend Studio 无法启动的问题解决方法
Dec 04 PHP
PHP 日期时间函数的高级应用技巧
Oct 10 PHP
php做下载文件的实现代码及文件名中乱码解决方法
Feb 03 PHP
基于PHP输出缓存(output_buffering)的深入理解
Jun 13 PHP
PHP中开启gzip压缩的2种方法
Jan 31 PHP
php实现随机显示图片方法汇总
May 21 PHP
php源码分析之DZX1.5加密解密函数authcode用法
Jun 17 PHP
织梦sitemap地图实时推送给百度的教程
Aug 03 PHP
基于PHP给大家讲解防刷票的一些技巧
Nov 18 PHP
YII框架批量插入数据的方法
Mar 18 PHP
Laravel框架实现利用中间件进行操作日志记录功能
Jun 06 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 配置后台登录以及模板引入
2017/01/24 PHP
PHP实现文字写入图片功能
2019/02/18 PHP
Javascript 验证上传图片大小[客户端]
2009/08/01 Javascript
open 动态修改img的onclick事件示例代码
2013/11/13 Javascript
javascript中普通函数的使用介绍
2013/12/19 Javascript
iframe里使用JavaScript控制主页转向的方法
2015/04/03 Javascript
Javascript生成带参数的二维码示例
2016/10/10 Javascript
基于JS实现checkbox全选功能实例代码
2016/10/31 Javascript
JavaScript 监控微信浏览器且自带返回按钮时间
2016/11/27 Javascript
详解vue-meta如何让你更优雅的管理头部标签
2018/01/18 Javascript
更改BootStrap popover的默认样式及popover简单用法
2018/09/13 Javascript
js中位运算的运用实例分析
2018/12/11 Javascript
关于IDEA中的.VUE文件报错 Export declarations are not supported by current JavaScript version
2020/10/17 Javascript
vue 通过 Prop 向子组件传递数据的实现方法
2020/10/30 Javascript
[01:13:59]LGD vs Mineski Supermajor 胜者组 BO3 第三场 6.5
2018/06/06 DOTA
Python中使用Tkinter模块创建GUI程序实例
2015/01/14 Python
python实现FTP服务器服务的方法
2017/04/11 Python
python实现unicode转中文及转换默认编码的方法
2017/04/29 Python
对python:threading.Thread类的使用方法详解
2019/01/31 Python
解决Django删除migrations文件夹中的文件后出现的异常问题
2019/08/31 Python
python使用opencv实现马赛克效果示例
2019/09/28 Python
python GUI库图形界面开发之PyQt5打印控件QPrinter详细使用方法与实例
2020/02/28 Python
关于python中的xpath解析定位
2020/03/06 Python
HTML5 device access 设备访问详解
2018/05/24 HTML / CSS
英国最大的独立摄影零售商:Park Cameras
2019/11/27 全球购物
德国亚洲食品网上商店:asiafoodland.de
2019/12/28 全球购物
什么是事务?为什么需要事务?
2012/01/09 面试题
会计应聘求职信范文
2013/12/17 职场文书
银行青年文明号事迹材料
2014/05/31 职场文书
销售队伍口号
2014/06/11 职场文书
保护地球的标语
2014/06/17 职场文书
中学清明节活动总结
2014/07/04 职场文书
华山导游词
2015/02/03 职场文书
技术支持岗位职责
2015/02/13 职场文书
八年级作文之我的母亲
2019/12/10 职场文书
Vue 打包后相对路径的引用问题
2022/06/05 Vue.js