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 增加了对 .ZIP 文件的读取功能
Oct 09 PHP
解决了Ajax、MySQL 和 Zend Framework 的乱码问题
Mar 03 PHP
php UBB 解析实现代码
Nov 27 PHP
改写函数实现PHP二维/三维数组转字符串
Sep 13 PHP
php实现用于验证所有类型的信用卡类
Mar 24 PHP
dvwa+xampp搭建显示乱码的问题及解决方案
Aug 23 PHP
WordPress中创建用户角色的相关PHP函数使用详解
Dec 25 PHP
PHP MVC框架skymvc支持多文件上传
May 26 PHP
PHP中ID设置自增后不连续的原因分析及解决办法
Aug 21 PHP
php中namespace及use用法分析
Dec 06 PHP
PHP高精确度运算BC函数库实例详解
Aug 15 PHP
PHP 计算两个时间段之间交集的天数示例
Oct 24 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下通过curl抓取yahoo boss 搜索结果的实现代码
2011/06/10 PHP
PHP5.4中json_encode中文转码的变化小结
2013/01/30 PHP
在wamp集成环境下升级php版本(实现方法)
2013/07/01 PHP
PHP 面向对象程序设计(oop)学习笔记(三) - 单例模式和工厂模式
2014/06/12 PHP
PHP链接MySQL的常用扩展函数
2014/10/23 PHP
PHP使用ffmpeg给视频增加字幕显示的方法
2015/03/12 PHP
php找出指定范围内回文数且平方根也是回文数的方法
2015/03/23 PHP
JavaScript 的方法重载效果
2009/08/07 Javascript
jQuery的控件及事件(输入控件及回车事件)使用示例
2013/07/25 Javascript
微信小程序开发(二)图片上传+服务端接收详解
2017/01/11 Javascript
详谈Angular路由与Nodejs路由的区别
2017/03/05 NodeJs
详解探索 vuex 2.0 以及使用 vuejs 2.0 + vuex 2.0 构建记事本应用
2017/06/16 Javascript
JavaScript实现瀑布流图片效果
2017/06/30 Javascript
JS实现静态页面搜索并高亮显示功能完整示例
2017/09/19 Javascript
基于VUE的v-charts的曲线显示功能
2019/10/01 Javascript
js仿360开机效果
2019/12/26 Javascript
ES6使用 Array.includes 处理多重条件用法实例分析
2020/03/02 Javascript
全面了解Nginx, WSGI, Flask之间的关系
2018/01/09 Python
一篇文章快速了解Python的GIL
2018/01/12 Python
Python查找两个有序列表中位数的方法【基于归并算法】
2018/04/20 Python
对python条件表达式的四种实现方法小结
2019/01/30 Python
python sklearn库实现简单逻辑回归的实例代码
2019/07/01 Python
Pytorch 实现计算分类器准确率(总分类及子分类)
2020/01/18 Python
在 Python 中接管键盘中断信号的实现方法
2020/02/04 Python
Python中无限循环需要什么条件
2020/05/27 Python
python pymysql链接数据库查询结果转为Dataframe实例
2020/06/05 Python
使用javascript和HTML5 Canvas画的四渐变色播放按钮效果
2014/04/10 HTML / CSS
HTML5自定义mp3播放器源码
2020/01/06 HTML / CSS
关于HTML5+ API plusready的兼容问题
2020/11/20 HTML / CSS
linux比较文件内容的命令是什么
2015/09/23 面试题
高中生自我鉴定范文
2013/10/30 职场文书
2014年社区居委会主任重阳节讲话稿
2014/09/25 职场文书
2015年三好一满意工作总结
2015/07/24 职场文书
2016中秋节晚会开场白
2015/11/26 职场文书
2019年怎样才能撰写出优秀的自荐信
2019/03/25 职场文书
HTML+CSS实现导航条下拉菜单的示例代码
2021/08/02 HTML / CSS