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代码
Mar 03 PHP
解析PHP中DIRECTORY_SEPARATOR,PATH_SEPARATOR两个常量的作用
Jun 21 PHP
PHP中的闭包(匿名函数)浅析
Feb 07 PHP
PHP explode()函数的几个应用和implode()函数有什么区别
Nov 05 PHP
CI(Codeigniter)的Setting增强配置类实例
Jan 06 PHP
PHP5.5迭代生成器用法实例详解
Mar 16 PHP
php 遍历目录,生成目录下每个文件的md5值并写入到结果文件中
Dec 12 PHP
thinkPHP中U方法加密传递参数功能示例
May 29 PHP
php实现微信原生支付(扫码支付)功能
May 30 PHP
掌握PHP垃圾回收机制详解
Mar 13 PHP
php实现分页功能的详细实例方法
Sep 29 PHP
gearman中worker常驻后台,导致MySQL server has gone away的解决方法
Feb 27 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你的验证码安全码?
2007/01/02 PHP
php中取得URL的根域名的代码
2011/03/23 PHP
PHP 中 DOMDocument保存xml时中文出现乱码问题的解决方案
2016/09/19 PHP
PHP实现可精确验证身份证号码的工具类示例
2018/05/31 PHP
PHP程序员简单的开展服务治理架构操作详解(三)
2020/05/14 PHP
JavaScript使用技巧精萃[代码非常实用]
2008/11/21 Javascript
一个级联菜单代码学习及removeClass与addClass的应用
2013/01/24 Javascript
解析DHTML,JavaScript,DOM,BOM以及WEB标准的描述
2013/06/19 Javascript
浅谈JavaScript之事件绑定
2013/07/08 Javascript
javascript不可用的问题探究
2013/10/01 Javascript
jQuery中ajax和post处理json的不同示例对比
2014/11/02 Javascript
jquery简单实现外部链接用新窗口打开的方法
2015/05/30 Javascript
深入学习jQuery Validate表单验证
2016/01/18 Javascript
原生JavaScript制作微博发布面板效果
2016/03/11 Javascript
jquery UI Datepicker时间控件冲突问题解决
2016/12/16 Javascript
JS常见算法详解
2017/02/28 Javascript
jQuery简单绑定单个事件的方法示例
2017/06/10 jQuery
一个Vue页面的内存泄露分析详解
2018/06/25 Javascript
Javascript实现一朵从含苞到绽放的玫瑰
2019/03/30 Javascript
Jquery异步上传文件代码实例
2019/11/13 jQuery
JS中FileReader类实现文件上传及时预览功能
2020/03/27 Javascript
[50:28]LGD女子学院第三期 DOTA2复仇之魂教学
2013/12/24 DOTA
在Python中利用Pandas库处理大数据的简单介绍
2015/04/07 Python
举例讲解Python中的Null模式与桥接模式编程
2016/02/02 Python
Python面向对象编程之继承与多态详解
2018/01/16 Python
python互斥锁、加锁、同步机制、异步通信知识总结
2018/02/11 Python
numpy中矩阵合并的实例
2018/06/15 Python
python输入整条数据分割存入数组的方法
2018/11/13 Python
pyttsx3实现中文文字转语音的方法
2018/12/24 Python
python elasticsearch环境搭建详解
2019/09/02 Python
不用游标的SQL语句有哪些
2012/09/07 面试题
国培远程培训感言
2014/03/08 职场文书
学习教师敬业奉献模范事迹材料思想汇报
2014/09/19 职场文书
对外汉语教师推荐信
2015/03/27 职场文书
vue首次渲染全过程
2021/04/21 Vue.js
MutationObserver在页面水印实现起到的作用详解
2022/07/07 Javascript