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 相关文章推荐
PHP4引用文件语句的对比
Oct 09 PHP
php 数组使用详解 推荐
Jun 02 PHP
php异常处理技术,顶级异常处理器
Jun 13 PHP
一个php生成16位随机数的代码(两种方法)
Sep 16 PHP
Windows下的PHP安装pear教程
Oct 24 PHP
解决ThinkPHP关闭调试模式时报错的问题汇总
Apr 22 PHP
php一个解析字符串排列数组的方法
May 12 PHP
PHP中的traits简单使用实例
May 13 PHP
Smarty分页实现方法完整实例
May 11 PHP
PHP实现中国公民身份证号码有效性验证示例代码
May 03 PHP
PHP中的浅复制与深复制的实例详解
Oct 26 PHP
PHP工厂模式简单实现方法示例
May 23 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
根德YB400的电路分析
2021/03/02 无线电
用PHP实现小型站点广告管理
2006/10/09 PHP
PHP编程中字符串处理的5个技巧小结
2007/11/13 PHP
PHP获取数组最大值下标的方法
2015/05/12 PHP
PHP中spl_autoload_register()函数用法实例详解
2016/07/18 PHP
thinkPHP线上自动加载异常与修复方法实例分析
2016/12/01 PHP
Nigma vs Liquid BO3 第一场2.13
2021/03/10 DOTA
JQuery 学习笔记 选择器之三
2009/07/23 Javascript
编写简单的jQuery提示插件
2014/12/21 Javascript
页面内容排序插件jSort使用方法
2015/10/10 Javascript
很全面的JavaScript常用功能汇总集合
2016/01/22 Javascript
jquery插件Jplayer使用方法简析
2016/04/22 Javascript
如何使用jquery修改css中带有!important的样式属性
2016/04/28 Javascript
基于Bootstrap使用jQuery实现简单可编辑表格
2016/05/04 Javascript
web前端vue之CSS过渡效果示例
2018/01/10 Javascript
Layui tree 下拉菜单树的实例代码
2019/09/21 Javascript
浅谈Vue3.0新版API之composition-api入坑指南
2020/04/30 Javascript
用Python编写一个国际象棋AI程序
2014/11/28 Python
Python文件右键找不到IDLE打开项解决办法
2015/06/08 Python
numpy.linspace 生成等差数组的方法
2018/07/02 Python
Python数据结构之栈、队列及二叉树定义与用法浅析
2018/12/27 Python
python的内存管理和垃圾回收机制详解
2019/05/18 Python
python3.7 使用pymssql往sqlserver插入数据的方法
2019/07/08 Python
Python 3.8 新功能全解
2019/07/25 Python
python绘制雪景图
2019/12/16 Python
python 使用cx-freeze打包程序的实现
2020/03/14 Python
捷克移动配件网上商店:ProMobily.cz
2019/03/15 全球购物
Servlet如何得到客户端机器的信息
2014/10/17 面试题
可贵的沉默教学反思
2014/02/06 职场文书
销售员个人求职的自我评价
2014/02/10 职场文书
小学二年级学生评语
2014/04/21 职场文书
查摆问题整改措施范文
2014/10/11 职场文书
党建工作整改措施
2014/10/28 职场文书
党的群众路线教育实践活动个人对照检查材料(企业)
2014/11/05 职场文书
解决redis sentinel 频繁主备切换的问题
2021/04/12 Redis
python实现简单聊天功能
2021/07/07 Python