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高级OOP技术演示
Aug 27 PHP
php 连接mssql数据库 初学php笔记
Mar 01 PHP
PHP 杂谈《重构-改善既有代码的设计》之四 简化条件表达式
Apr 09 PHP
php调用方法mssql_fetch_row、mssql_fetch_array、mssql_fetch_assoc和mssql_fetch_objcect读取数据的区别
Aug 08 PHP
php递归使用示例(php递归函数)
Feb 14 PHP
php数组查找函数in_array()、array_search()、array_key_exists()使用实例
Apr 29 PHP
一个经典的PHP文件上传类分享
Nov 18 PHP
8个必备的PHP功能开发
Oct 02 PHP
PHP程序中使用adodb连接不同数据库的代码实例
Dec 19 PHP
Laravel使用消息队列需要注意的一些问题
Dec 13 PHP
Laravel框架实现即点即改功能的方法分析
Oct 31 PHP
浅谈php常用的7大框架的优缺点
Jul 20 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读取txt文件组成SQL并插入数据库的代码(原创自Zjmainstay)
2012/07/31 PHP
php防注入及开发安全详细解析
2013/08/09 PHP
php通过sort()函数给数组排序的方法
2015/03/18 PHP
使用PHP生成图片的缩略图的方法
2015/08/18 PHP
PHP时间类完整实例(非常实用)
2015/12/25 PHP
深入浅析用PHP实现MVC
2016/03/02 PHP
PHP使用反射机制实现查找类和方法的所在位置
2016/04/22 PHP
Ajax和PHP正则表达式验证表单及验证码
2016/09/24 PHP
php 使用ActiveMQ发送消息,与处理消息操作示例
2020/02/23 PHP
YUI 读码日记之 YAHOO.lang.is*
2008/03/22 Javascript
特殊情况下如何获取span里面的值
2014/05/20 Javascript
jQuery之Deferred对象详解
2014/09/04 Javascript
Web表单提交之disabled问题js解决方法
2015/01/13 Javascript
Javascript中With语句用法实例
2015/05/14 Javascript
使用AngularJS对表单提交内容进行验证的操作方法
2017/07/12 Javascript
vue-cli3.0+element-ui上传组件el-upload的使用
2018/12/03 Javascript
vue中使用vee-validator完成表单校验方案
2019/11/01 Javascript
解决Echarts2竖直datazoom滑动后显示数据不全的问题
2020/07/20 Javascript
[01:31:22]Ti4 循环赛第四日附加赛LGD vs Mouz
2014/07/13 DOTA
Python使用scrapy采集数据时为每个请求随机分配user-agent的方法
2015/04/08 Python
python检测某个变量是否有定义的方法
2015/05/20 Python
关于pip的安装,更新,卸载模块以及使用方法(详解)
2017/05/19 Python
Python实现将Excel转换为json的方法示例
2017/08/05 Python
pyqt5自定义信号实例解析
2018/01/31 Python
Python判断一个list中是否包含另一个list全部元素的方法分析
2018/12/24 Python
python 判断字符串中是否含有汉字或非汉字的实例
2019/07/15 Python
python程序中的线程操作 concurrent模块使用详解
2019/09/23 Python
如何通过安装HomeBrew来安装Python3
2020/12/23 Python
档案接收函范文
2014/01/10 职场文书
网上蛋糕店创业计划书
2014/01/24 职场文书
生育关怀行动实施方案
2014/03/26 职场文书
2014年村官工作总结
2014/11/24 职场文书
2015年全国爱眼日活动方案
2015/05/05 职场文书
经费申请报告范文
2015/05/18 职场文书
matplotlib之pyplot模块实现添加子图subplot的使用
2021/04/25 Python
table不让td文字溢出操作方法
2022/12/24 HTML / CSS