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 相关文章推荐
玩转图像函数库―常见图形操作
Sep 03 PHP
一棵php的类树(支持无限分类)
Oct 09 PHP
php 中include()与require()的对比
Oct 09 PHP
php中判断数组是一维,二维,还是多维的解决方法
May 04 PHP
php加密算法之实现可逆加密算法和解密分享
Jan 21 PHP
ThinkPHP学习笔记(一)ThinkPHP部署
Jun 22 PHP
php将金额数字转化为中文大写
Jul 09 PHP
深入分析PHP优化及注意事项
Jul 04 PHP
php导出csv文件,可导出前导0实例代码
Nov 16 PHP
php+ajax无刷新上传图片的实现方法
Dec 06 PHP
PHP符合PSR编程规范的实例分享
Dec 21 PHP
thinkphp3.2嵌入百度编辑器ueditor的实例代码
Jul 13 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 Cookie的一个使用注意点
2008/11/08 PHP
使用zend studio for eclipse不能激活代码提示功能的解决办法
2009/10/11 PHP
PHP高自定义性安全验证码代码
2011/11/27 PHP
Yii2设置默认控制器的两种方法
2017/05/19 PHP
关于javascript 回调函数中变量作用域的讨论
2009/09/11 Javascript
html中table数据排序的js代码
2011/08/09 Javascript
情人节专属 纯js脚本1k大小的3D玫瑰效果
2012/02/11 Javascript
json数据与字符串的相互转化示例
2013/09/18 Javascript
jQuery 获取和设置select下拉框的值实现代码
2013/11/08 Javascript
javascript实现动态模态绑定grid过程代码
2014/09/22 Javascript
JS实现5秒钟自动封锁div层的方法
2015/02/20 Javascript
JavaScript判断数组是否包含指定元素的方法
2015/07/01 Javascript
浅谈jQuery中hide和fadeOut的区别 show和fadeIn的区别
2016/08/18 Javascript
AngularJS通过$sce输出html的方法
2016/09/22 Javascript
webpack学习--webpack经典7分钟入门教程
2017/06/28 Javascript
Node.js之删除文件夹(含递归删除)代码实例
2019/09/09 Javascript
JS脚本实现定时到网站上签到/签退功能
2020/04/22 Javascript
js HTML DOM EventListener功能与用法实例分析
2020/04/27 Javascript
多页vue应用的单页面打包方法(内含打包模式的应用)
2020/06/11 Javascript
解决vue-photo-preview 异步图片放大失效的问题
2020/07/29 Javascript
[02:48]DOTA2英雄基础教程 拉席克
2013/12/12 DOTA
在Python的Flask框架中使用日期和时间的教程
2015/04/21 Python
浅谈python和C语言混编的几种方式(推荐)
2017/09/27 Python
python实现求最长回文子串长度
2018/01/22 Python
python笔记之mean()函数实现求取均值的功能代码
2019/07/05 Python
python并发爬虫实用工具tomorrow实用解析
2019/09/25 Python
Python原始套接字编程实例解析
2020/01/29 Python
在django admin详情表单显示中添加自定义控件的实现
2020/03/11 Python
猫咪家具:CatsPlay
2018/11/03 全球购物
马来西亚在线健康商店:Medipal Malaysia
2020/04/13 全球购物
编辑找工作求职信范文
2013/12/16 职场文书
优秀老员工获奖感言
2014/02/15 职场文书
金融专业毕业生自荐信
2014/06/26 职场文书
2014年医院工作总结
2014/11/20 职场文书
联谊会开场白
2015/06/01 职场文书
漫画「古见同学有交流障碍症」第25卷封面公开
2022/03/21 日漫