PHP实现随机生成水印图片功能


Posted in PHP onMarch 22, 2017

基于PHP的GD图形库,自己生成一张图片。仅限初识GD库,实例学习。

一、需求

网站的布局用到了类似慕课网课程列表的风格,每一个课程是一个banner图,图下面是标题加简介。因为课程的数量较大没有为所有的课程设计专门的banner,所以需要按照一定的规则,来自己生成图片(本打算用div布局来解决,但div+img在响应式布局中不是很好控制)。

生成的效果图:

PHP实现随机生成水印图片功能

二、工具&素材

1.PHP开启GD图形库扩展
2.准备多个小的水印图
3.获取预生成图片的背景色RGB值

三、代码

生成图片的过程,代码中做了详细的注释。

class GenerateRandomImage
{
  /** @var integer 图片宽度 */
  public $imgWidth = 272;
  /** @var integer 图片高度 */
  public $imgHeight = 162;
  /** @var 根据type不同来生成不同的背景颜色,目前留个type分别为蓝色、紫色、黄色、绿色、灰色、土黄色 */
  public $type = '';
  /** @var 图片上要显示的文字 */
  public $text = '';
  /** @var integer 图片上文字的字体大小 */
  public $fontSize = 16;

  public function __construct($type, $text)
  {
    $this->type = $type;
    $this->text = $text;
  }
  /**
   * 创建生成随机图片
   * @author bignerd
   * @since 2017-03-21T14:49:41+0800
   */
  public function createImg()
  {
    /** @var 创建一个指定图片大小的空调色板
    $image = imagecreate($this->imgWidth, $this->imgHeight);
    $rgb  = $this->getBackground($this->type);
    /** @var 为图片创建一个背景色 */
    $backgroundColor = imagecolorallocate($image, $rgb['r'], $rgb['g'], $rgb['b']);
    /** @var 创建文字白色字体 */
    $textColor = imagecolorallocate($image, 255, 255, 255);
    /** @var 字体文件路径 */
    $font = $_SERVER['DOCUMENT_ROOT'].'/public/font/simhei.ttf';

    $x = 18;//文字起始位置x坐标
    $y = 50;//文字起始位置y坐标
    /** 文字写入图片 */
    $angle = 0;//角度0
    imagettftext($image, $this->fontSize, $angle, $x, $y, $textColor, $font, $this->text);
    /** @var 水印图片路径 **/
    $waterImgPath = $this->randWaterImage();
    /** @var 获取图片信息,返回值$waterInfo[2] 为图片类型常量 */
    $waterInfo  = getimagesize($waterImgPath);
    /** @var 将图片类型常量转换为真正的类型,如png */
    $waterType  = image_type_to_extension($waterInfo[2], false);//获取文件类型

    $createImageFunc = 'imagecreatefrom'.$waterType;
    /** @var 创建一个水印图片的副本 $createImageFunc 为根据图片类型来动态生成预调用的创建图片函数*/
    $mask = $createImageFunc($waterImgPath);
    $posX = $this->imgWidth - $waterInfo[0];//水印图片,在目标图片中的位置的x坐标
    $posY = $this->imgHeight - $waterInfo[1];//水印图片,在目标图片中的位置的y坐标
    /** http请求响应类型设置为 image/png 以便直接显示为图片 */
    header("Content-Type:image/png");
    /** 水印图片复制到创建的image */
    imagecopy($image, $mask, $posX, $posY, 0, 0, $waterInfo[0], $waterInfo[1]);
    imagepng($image);//输入图片到浏览器或者文件
    imagedestroy($image);//销毁图片
  } 
  /**
   * 图片背景颜色的rgb值
   * @author bignerd
   * @since 2017-03-21T14:50:16+0800
   */
  public function getBackground()
  {
    $background = [
      '1'=>['r'=>0, 'g'=>160,'b'=>233],
      '2'=>['r'=>198,'g'=>0, 'b'=>110],
      '3'=>['r'=>237,'g'=>109,'b'=>0],
      '4'=>['r'=>33, 'g'=>148,'b'=>75],
      '5'=>['r'=>63, 'g'=>58, 'b'=>57],      
      '6'=>['r'=>202,'g'=>162,'b'=>101],
    ];
    return $background[$this->type];
  }
  /**
   * 随机水印图片路径
   * @author bignerd
   * @since 2017-03-21T14:51:00+0800
   * @return 路径
   */
  public function randWaterImage()
  {
    $folder = [
      '1'=>'product','2'=>'team','3'=>'architecture','4'=>'developer','5'=>'test','6'=>'engineer'
    ];
    $targetFolder = $_SERVER['DOCUMENT_ROOT'].'/public/images/role/'.$folder[$this->type].'/'.rand(1,38).'.png';
    return $targetFolder;
  }
}

$image = new GenerateRandomImage(1,"扛得住的MySql数据架构");
$image->createImg();

这样我们就可以直接在页面中使用 <img src="http://xxx.com/GenerateRandomImage.php" />来直接显示图片。

注意:过程中遇到过一个问题:如果水印图片是透明的png图片,那将水印图片复制到image中时,会显示为白色背景,与我们设定 的image背景无法透明融合,所以对随机的水印图片也需要做同样的颜色处理。

四、总结

这个小示例用简单的步骤来生成一张图片,直接显示在浏览器,也可以给imagepng加第二参数,也就是路径,以保存图片。所以学会示例中的几个GD库中的方法,就可以实现创建图片、为图片添加文字水印、或图片水印。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
PHP 开源框架22个简单简介
Aug 24 PHP
用PHP将网址字符串转换成超链接(网址或email)
May 25 PHP
PHP中遍历stdclass object的实现代码
Jun 09 PHP
MySQL的FIND_IN_SET函数使用方法分享
Mar 27 PHP
解析php二分法查找数组是否包含某一元素
May 23 PHP
php curl基本操作详解
Jul 23 PHP
php通过隐藏表单控件获取到前两个页面的url
Sep 09 PHP
PHP SOCKET编程详解
May 22 PHP
php实现倒计时效果
Dec 19 PHP
微信小程序 消息推送php服务器验证实例详解
Mar 30 PHP
php反序列化长度变化尾部字符串逃逸(0CTF-2016-piapiapia)
Feb 15 PHP
php设计模式之策略模式实例分析【星际争霸游戏案例】
Mar 26 PHP
php session的应用详细介绍
Mar 22 #PHP
php 开发中加密的几种方法总结
Mar 22 #PHP
详解Yii2高级版引入bootstrap.js的一个办法
Mar 21 #PHP
详解Yii2.0 rules验证规则集合
Mar 21 #PHP
php连接mysql数据库
Mar 21 #PHP
Thinkphp实现站点静态化的方法详解
Mar 21 #PHP
php登录超时检测功能实例详解
Mar 21 #PHP
You might like
php SQL防注入代码集合
2008/04/25 PHP
php笔记之:文章中图片处理的使用
2013/04/26 PHP
php 地区分类排序算法
2013/07/01 PHP
php中使用PHPExcel读写excel(xls)文件的方法
2014/09/15 PHP
几行代码轻松实现PHP文件打包下载zip
2017/03/01 PHP
javascript string字符串优化问题
2011/07/31 Javascript
script标签属性type与language使用选择
2012/12/02 Javascript
动态加载js、css的简单实现代码
2016/05/26 Javascript
JavaScript6 let 新语法优势介绍
2016/07/15 Javascript
jquery.picsign图片标注组件实例详解
2018/02/02 jQuery
vue-quill-editor+plupload富文本编辑器实例详解
2018/10/19 Javascript
通过jQuery学习js类型判断的技巧
2019/05/27 jQuery
VUE实现移动端列表筛选功能
2019/08/23 Javascript
对layui中的onevent 和event的使用详解
2019/09/06 Javascript
Vue实现移动端拖拽交换位置
2020/07/29 Javascript
Django的数据模型访问多对多键值的方法
2015/07/21 Python
一步步教你用Python实现2048小游戏
2017/01/19 Python
详解Python中的动态属性和特性
2018/04/07 Python
pandas多级分组实现排序的方法
2018/04/20 Python
Django 使用easy_thumbnails压缩上传的图片方法
2019/07/26 Python
对YOLOv3模型调用时候的python接口详解
2019/08/26 Python
学Python 3的理由和必要性
2019/11/19 Python
Python3 读取Word文件方式
2020/02/13 Python
Pycharm激活方法及详细教程(详细且实用)
2020/05/12 Python
Python迭代器协议及for循环工作机制详解
2020/07/14 Python
html5 Canvas画图教程(5)—canvas里画曲线之arc方法
2013/01/09 HTML / CSS
瑞典时尚耳机品牌:Urbanears
2017/07/26 全球购物
会计电算一体化个人简历的自我评价
2013/10/15 职场文书
酒店管理专业毕业生推荐信
2013/11/10 职场文书
新学期开学寄语
2014/01/18 职场文书
文员岗位职责范本
2014/03/08 职场文书
绿色环保标语
2014/06/12 职场文书
物业管理专业自荐信
2014/07/01 职场文书
党员先进事迹材料
2014/12/19 职场文书
通知格式
2015/04/27 职场文书
详解Python如何批量采集京东商品数据流程
2022/01/22 Python