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 相关文章推荐
PHP4实际应用经验篇(2)
Oct 09 PHP
PHP编程中字符串处理的5个技巧小结
Nov 13 PHP
php将fileterms函数返回的结果变成可读的形式
Apr 21 PHP
php 缩略图实现函数代码
Jun 23 PHP
如何使用Strace调试工具
Jun 03 PHP
php单例模式的简单实现方法
Jun 10 PHP
Netbeans 8.2将支持PHP7 更精彩
Jun 13 PHP
php操作路径的经典方法(必看篇)
Oct 04 PHP
PHP 文件锁与进程锁的使用示例
Aug 07 PHP
PHP以json或xml格式返回请求数据的方法
May 31 PHP
PHP7.1实现的AES与RSA加密操作示例
Jun 15 PHP
php中的explode()函数实例介绍
Jan 18 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
Smarty Foreach 使用说明
2010/03/23 PHP
PHP ? EasyUI DataGrid 资料取的方式介绍
2012/11/07 PHP
基于PHP Socket配置以及实例的详细介绍
2013/06/13 PHP
php 模拟post_验证页面的返回状态(实例讲解)
2013/10/28 PHP
php截取中文字符串函数实例
2015/02/23 PHP
学习php设计模式 php实现装饰器模式(decorator)
2015/12/07 PHP
程序员的表白神器“520”大声喊出来
2016/05/20 PHP
py文件转exe时包含paramiko模块出错解决方法
2016/08/12 PHP
JS 统计时间
2021/03/09 Javascript
JavaScript中的几个关键概念的理解-原型链的构建
2011/05/12 Javascript
javascript中的注释使用与注意事项小结
2011/09/20 Javascript
jquery实现类似EasyUI的页面布局可改变左右的宽度
2020/09/12 Javascript
Json实现异步请求提交评论无需跳转其他页面
2014/10/11 Javascript
js实现n秒倒计时后才可以点击的效果
2015/12/20 Javascript
jquery实现右侧栏菜单选择操作
2016/03/04 Javascript
jquery $.trim()去除字符串空格的实现方法【附图例】
2016/03/30 Javascript
AngularJS监听路由的变化示例代码
2016/09/23 Javascript
详解网站中图片日常使用以及优化手法
2017/01/09 Javascript
使用jQuery实现鼠标点击左右按钮滑动切换
2017/08/04 jQuery
微信小程序出现wx.navigateTo页面不跳转问题的解决方法
2017/12/26 Javascript
vue-drag-chart 拖动/缩放图表组件的实例代码
2020/04/10 Javascript
vue+element_ui上传文件,并传递额外参数操作
2020/12/05 Vue.js
Vue组件简易模拟实现购物车
2020/12/21 Vue.js
Python实现微信公众平台自定义菜单实例
2015/03/20 Python
Django MEDIA的配置及用法详解
2019/07/25 Python
Flask框架搭建虚拟环境的步骤分析
2019/12/21 Python
HTML5本地存储之Database Storage应用介绍
2013/01/06 HTML / CSS
美国知名艺术画网站:Art.com
2017/02/09 全球购物
Superdry极度干燥美国官网:英国制造的服装品牌
2018/11/13 全球购物
经典c++面试题四
2015/05/14 面试题
工地安全质量标语
2014/06/07 职场文书
人事专员岗位职责说明书
2014/07/30 职场文书
人事代理委托书
2014/09/27 职场文书
工程承包协议书
2014/10/20 职场文书
2015年爱国卫生工作总结
2015/04/22 职场文书
2015年教研室工作总结范文
2015/05/23 职场文书