基于PHP实现生成随机水印图片


Posted in PHP onDecember 09, 2020

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

一、需求

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

二、工具&素材

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中使用Imagick实现图像直方图的实现代码
Aug 30 PHP
PHP文章采集URL补全函数(FormatUrl)
Aug 02 PHP
PHP字符串的编码问题的详细介绍
Apr 27 PHP
PHP中的排序函数sort、asort、rsort、krsort、ksort区别分析
Aug 18 PHP
PHP连接MSSQL时nvarchar字段长度被截断为255的解决方法
Dec 25 PHP
Php-Redis安装测试笔记
Mar 05 PHP
微信支付开发订单查询实例
Jul 12 PHP
php自定义函数实现二维数组排序功能
Jul 20 PHP
PHP实现的登录,注册及密码修改功能分析
Nov 25 PHP
PHP排序算法之基数排序(Radix Sort)实例详解
Apr 21 PHP
PHP CURL中传递cookie的方法步骤
May 09 PHP
php计数排序算法的实现代码(附四个实例代码)
Mar 31 PHP
PHP实现腾讯短网址生成api接口实例
Dec 08 #PHP
win10下 php安装seaslog扩展的详细步骤
Dec 04 #PHP
深入理解PHP+Mysql分布式事务与解决方案
Dec 03 #PHP
浅谈PHP中的那些魔术常量
Dec 02 #PHP
PHP中的输出echo、print、printf、sprintf、print_r和var_dump的示例代码
Dec 01 #PHP
php如何实现数据库的备份和恢复
Nov 30 #PHP
php实现简单四则运算器
Nov 29 #PHP
You might like
PHP模块memcached使用指南
2014/12/08 PHP
php使用parse_url和parse_str解析URL
2015/02/22 PHP
在WordPress中获取数据库字段内容和添加主题设置菜单
2016/01/11 PHP
PHP/ThinkPHP实现批量打包下载文件的方法示例
2017/07/31 PHP
php实现与python进行socket通信的方法示例
2017/08/30 PHP
php-fpm超时时间设置request_terminate_timeout资源问题分析
2019/09/27 PHP
js如何打印object对象
2015/10/16 Javascript
JavaScript中的数据类型转换方法小结
2015/10/26 Javascript
javascript 中的 delete及delete运算符
2015/11/15 Javascript
基于Node.js的WebSocket通信实现
2017/03/11 Javascript
Node.js 的模块知识汇总
2017/08/16 Javascript
vue-router 路由基础的详解
2017/10/17 Javascript
vue用递归组件写树形控件的实例代码
2018/07/19 Javascript
React通过redux-persist持久化数据存储的方法示例
2019/02/14 Javascript
JS使用正则表达式判断输入框失去焦点事件
2019/10/16 Javascript
微信小程序监听用户登录事件的实现方法
2019/11/11 Javascript
Java Varargs 可变参数用法详解
2020/01/28 Javascript
JavaScript鼠标拖拽事件详解
2020/04/03 Javascript
mapboxgl区划标签避让不遮盖实现的代码详解
2020/07/01 Javascript
Vue+penlayers实现多边形绘制及展示
2020/12/24 Vue.js
[56:00]2018DOTA2亚洲邀请赛 4.6 淘汰赛 VP vs TNC 第二场
2018/04/10 DOTA
python网络编程之读取网站根目录实例
2014/09/30 Python
Python XML RPC服务器端和客户端实例
2014/11/22 Python
python迭代器与生成器详解
2016/03/10 Python
Python程序退出方式小结
2017/12/09 Python
Django实现分页功能
2018/07/02 Python
浅谈python常用程序算法
2019/03/22 Python
django admin管理工具自定义时间区间筛选器DateRangeFilter介绍
2020/05/19 Python
如何利用python 读取配置文件
2021/01/06 Python
Vans澳大利亚官网:购买鞋子、服装及配件
2019/09/05 全球购物
实习护士自我鉴定
2013/10/13 职场文书
关爱女孩行动实施方案
2014/03/13 职场文书
英语课前三分钟演讲稿
2014/08/19 职场文书
个性与发展自我评价
2015/03/06 职场文书
志愿者工作心得体会
2016/01/15 职场文书
解决Django transaction进行事务管理踩过的坑
2021/04/24 Python