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程序员工具
May 26 PHP
php读取msn上的用户信息类
Dec 05 PHP
php递归实现无限分类生成下拉列表的函数
Aug 08 PHP
php操作SVN版本服务器类代码
Nov 27 PHP
PHP实现文件下载详解
Nov 27 PHP
PHP对文件进行加锁、解锁实例
Jan 23 PHP
WordPress中用于获取文章作者与分类信息的方法整理
Dec 17 PHP
PHP常用字符串操作函数实例总结(trim、nl2br、addcslashes、uudecode、md5等)
Jan 09 PHP
PHP验证码类ValidateCode解析
Jan 07 PHP
PHP获取对象属性的三种方法实例分析
Jan 03 PHP
PHP 并发场景的几种解决方案
Jun 14 PHP
PHP xpath提取网页数据内容代码解析
Jul 16 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桌面中心(四) 数据显示
2007/03/11 PHP
PHP IF ELSE简化/三元一次式的使用
2011/08/22 PHP
Server.HTMLEncode让代码在页面里显示为源代码
2013/12/08 PHP
常见的四种POST 提交数据方式(小总结)
2015/10/08 PHP
php实现简单爬虫的开发
2016/03/28 PHP
php封装的mongodb操作类代码
2017/08/06 PHP
[对联广告] JS脚本类
2006/08/27 Javascript
JavaScript Event学习第八章 事件的顺序
2010/02/07 Javascript
Jquery之Ajax运用 学习运用篇
2011/09/26 Javascript
通过复制Table生成word和excel的javascript代码
2014/01/20 Javascript
使用jQuery中的when实现多个AJAX请求对应单个回调的例子分享
2014/04/23 Javascript
JS实现清除指定cookies的方法
2014/09/20 Javascript
JS+HTML+CSS实现轮播效果
2017/11/28 Javascript
微信小程序实现蒙版弹出窗功能
2019/09/17 Javascript
JavaScript 作用域scope简单汇总
2019/10/23 Javascript
vue data变量相互赋值后被实时同步的解决步骤
2020/08/05 Javascript
浅谈JavaScript 声明提升
2020/09/14 Javascript
[49:27]LGD vs OG 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
web.py获取上传文件名的正确方法
2014/08/26 Python
Python实现TCP/IP协议下的端口转发及重定向示例
2016/06/14 Python
使用Python来开发微信功能
2018/06/13 Python
Python后台开发Django会话控制的实现
2019/04/15 Python
详解Python3 pandas.merge用法
2019/09/05 Python
python语言的优势是什么
2020/06/17 Python
python3从网络摄像机解析mjpeg http流的示例
2020/11/13 Python
如何用H5实现一个触屏版的轮播器的实例
2017/01/09 HTML / CSS
俄罗斯品牌服装和鞋子的在线商店:KUPIVIP
2019/10/27 全球购物
美国优质宠物用品购买网站:Muttropolis
2020/02/17 全球购物
售后服务承诺书范文
2014/03/26 职场文书
战友聚会主持词
2014/04/02 职场文书
模特大赛策划方案
2014/05/28 职场文书
2015年安全生产责任书
2015/01/30 职场文书
事业单位聘任报告
2015/03/02 职场文书
思品教学工作总结
2015/08/10 职场文书
python执行js代码的方法
2021/05/13 Python
Python语言内置数据类型
2022/02/24 Python