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 相关文章推荐
example2.php
Oct 09 PHP
php字符串截取问题
Nov 28 PHP
PHP6 mysql连接方式说明
Feb 09 PHP
PHP获取文件后缀名的三个函数
Oct 15 PHP
php smarty truncate UTF8乱码问题解决办法
Jun 13 PHP
php实现读取超大文件的方法
Jul 28 PHP
PHP中使用Imagick实现各种图片效果实例
Jan 21 PHP
以实例全面讲解PHP中多进程编程的相关函数的使用
Aug 18 PHP
thinkphp5.1框架中容器(Container)和门面(Facade)的实现方法分析
Aug 05 PHP
laravel-admin解决表单select联动时,编辑默认没选上的问题
Sep 30 PHP
基于laravel belongsTo使用详解
Oct 18 PHP
php实现快速对二维数组某一列进行组装的方法小结
Dec 04 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
Discuz! Passport 通行证整合
2008/03/27 PHP
php获取操作系统语言代码
2013/11/04 PHP
PHP的Yii框架入门使用教程
2016/02/15 PHP
PHP解决中文乱码
2017/04/28 PHP
PHP容器类的两种实现方式示例
2019/07/24 PHP
深入理解JavaScript系列(39):设计模式之适配器模式详解
2015/03/04 Javascript
简介JavaScript中的unshift()方法的使用
2015/06/09 Javascript
js确认框confirm()用法实例详解
2016/01/07 Javascript
修改js confirm alert 提示框文字的简单实例
2016/06/10 Javascript
JavaScript函数中关于valueOf和toString的理解
2016/06/14 Javascript
老生常谈jquery id选择器和class选择器的区别
2017/02/12 Javascript
vue+jquery+lodash实现滑动时顶部悬浮固定效果
2018/04/28 jQuery
[04:32]玩具屠夫中文语音节选
2020/08/23 DOTA
Python的Django框架中的Context使用
2015/07/15 Python
python实现五子棋游戏
2019/06/18 Python
使用pandas 将DataFrame转化成dict
2019/12/10 Python
python3将变量写入SQL语句的实现方式
2020/03/02 Python
django 模版关闭转义方式
2020/05/14 Python
python中前缀运算符 *和 **的用法示例详解
2020/05/28 Python
关于Python 解决Python3.9 pandas.read_excel(‘xxx.xlsx‘)报错的问题
2020/11/28 Python
python BeautifulSoup库的安装与使用
2020/12/17 Python
意大利奢侈品网站:Italist
2016/08/23 全球购物
ROSEFIELD手表荷兰官方网上商店:北欧极简设计女士腕表品牌
2018/01/24 全球购物
法国房车租赁网站:Yescapa
2019/08/26 全球购物
Foot Locker澳洲官网:美国运动服和鞋类零售商
2019/10/11 全球购物
餐厅经理岗位职责范本
2014/02/17 职场文书
消防安全员岗位职责
2014/03/10 职场文书
学生会主席演讲稿
2014/04/25 职场文书
婚礼秀策划方案
2014/05/19 职场文书
初中同学会活动方案
2014/08/22 职场文书
临时用工协议书范本
2014/10/29 职场文书
五年级下册复习计划
2015/01/19 职场文书
工作态度检讨书范文
2015/05/06 职场文书
2019年手机市场的调研报告2篇
2019/10/10 职场文书
使用Java去实现超市会员管理系统
2022/03/18 Java/Android
【海涛教你打DOTA】死灵飞龙第一视角解说
2022/04/01 DOTA