基于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 相关文章推荐
基于mysql的论坛(1)
Oct 09 PHP
php数组函数序列之in_array() - 查找数组中是否存在指定值
Nov 07 PHP
php空间不支持socket但支持curl时recaptcha的用法
Nov 07 PHP
PHPExcel读取Excel文件的实现代码
Dec 06 PHP
保存到桌面、设为桌面且带图标的PHP代码
Nov 19 PHP
php获取YouTube视频信息的方法
Feb 11 PHP
php遍历删除整个目录及文件的方法
Mar 13 PHP
php操作MongoDB类实例
Jun 17 PHP
使用PHP和JavaScript判断请求是否来自微信内浏览器
Aug 18 PHP
PHP正则匹配操作简单示例【preg_match_all应用】
Jul 10 PHP
php在windows环境下获得cpu内存实时使用率(推荐)
Feb 08 PHP
thinkphp框架使用JWTtoken的方法详解
Oct 10 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脚本[带参数]的方法
2010/01/22 PHP
Memcache 在PHP中的使用技巧
2010/02/08 PHP
php通过ksort()函数给关联数组按照键排序的方法
2015/03/18 PHP
redirect_uri参数错误的解决方法(必看)
2017/02/16 PHP
分享几个超级震憾的图片特效
2012/01/08 Javascript
Jquery 过滤器(first,last,not,even,odd)的使用
2014/01/22 Javascript
jQuery使用ajaxSubmit()提交表单示例
2014/04/04 Javascript
javascript 闭包详解
2015/07/02 Javascript
js去字符串前后空格的实现方法
2016/02/26 Javascript
jQuery获取父元素及父节点的方法小结
2016/04/14 Javascript
Bootstrap组件学习之导航、标签、面包屑导航(精品)
2016/05/17 Javascript
Web打印解决方案之普通报表打印功能
2016/08/29 Javascript
Vue.js实现表格动态增加删除的方法(附源码下载)
2017/01/20 Javascript
详解VueJs前后端分离跨域问题
2017/05/24 Javascript
webpack学习教程之publicPath路径问题详解
2017/06/17 Javascript
js浏览器滚动条卷去的高度scrolltop(实例讲解)
2017/07/07 Javascript
redux-saga 初识和使用
2018/03/10 Javascript
vue移动端轻量级的轮播组件实现代码
2018/07/12 Javascript
jQuery实现菜单的显示和隐藏功能示例
2018/07/24 jQuery
js实现盒子滚动动画效果
2020/08/09 Javascript
python实现保存网页到本地示例
2014/03/16 Python
python使用正则表达式替换匹配成功的组并输出替换的次数
2017/11/22 Python
在Mac上删除自己安装的Python方法
2018/10/29 Python
python 定时器,实现每天凌晨3点执行的方法
2019/02/20 Python
pyqt5之将textBrowser的内容写入txt文档的方法
2019/06/21 Python
python web框架Flask实现图形验证码及验证码的动态刷新实例
2019/10/14 Python
Python操作SQLite/MySQL/LMDB数据库的方法
2019/11/07 Python
python wsgiref源码解析
2021/02/06 Python
见习期自我鉴定范文
2014/03/19 职场文书
物流管理系毕业生求职信
2014/06/03 职场文书
学校党的群众路线教育实践活动对照检查材料
2014/09/24 职场文书
小学生作文评语集锦
2014/12/25 职场文书
公司管理制度范本
2015/08/03 职场文书
2015年高中语文教学总结
2015/08/18 职场文书
React Native项目框架搭建的一些心得体会
2021/05/28 Javascript
python playwright之元素定位示例详解
2022/07/23 Python