基于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 正则学习实例
Jul 30 PHP
windows下升级PHP到5.3.3的过程及注意事项
Oct 12 PHP
提高php运行速度的一些小技巧分享
Jul 03 PHP
php 在windows下配置虚拟目录的方法介绍
Jun 26 PHP
使用PHP获取当前url路径的函数以及服务器变量
Jun 29 PHP
php采用curl模仿登录人人网发布动态的方法
Nov 07 PHP
php使用date和strtotime函数输出指定日期的方法
Nov 14 PHP
php中header跳转使用include包含解决参数丢失问题
May 08 PHP
PHP的Yii框架的基本使用示例
Aug 21 PHP
PDO::inTransaction讲解
Jan 28 PHP
PHP 多进程与信号中断实现多任务常驻内存管理实例方法
Oct 04 PHP
如何在PHP中使用AES加密算法加密数据
Jun 24 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 define()函数以及defined()函数的用法详解
2013/06/05 PHP
PHP实现与java 通信的插件使用教程
2019/08/11 PHP
js 颜色选择器(兼容firefox)
2009/03/05 Javascript
javascript 处理事件绑定的一些兼容写法
2009/12/24 Javascript
简短几句jquery代码的实现一个图片向上滚动切换
2011/09/02 Javascript
js showModalDialog 弹出对话框的简单实例(子窗体)
2014/01/07 Javascript
JavaScript控制table某列不显示的方法
2015/03/16 Javascript
javascript中的Base64、UTF8编码与解码详解
2015/03/18 Javascript
JS实现的简单鼠标跟随DiV层效果完整实例
2015/10/31 Javascript
jQuery常用知识点总结以及平时封装常用函数
2016/02/23 Javascript
js前端实现多图图片上传预览的两个方法(推荐)
2016/11/18 Javascript
js对象实例详解(JavaScript对象深度剖析,深度理解js对象)
2017/09/21 Javascript
实现vuex与组件data之间的数据同步更新方式
2019/11/12 Javascript
node.js通过url读取文件
2020/10/16 Javascript
python Django批量导入不重复数据
2016/03/25 Python
Django URL传递参数的方法总结
2016/08/28 Python
Python装饰器实现几类验证功能做法实例
2017/05/18 Python
解决python中使用plot画图,图不显示的问题
2018/07/04 Python
python使用rpc框架gRPC的方法
2018/08/24 Python
500行Python代码打造刷脸考勤系统
2019/06/03 Python
利用Python复制文件的9种方法总结
2019/09/02 Python
python用requests实现http请求代码实例
2019/10/31 Python
Python tensorflow实现mnist手写数字识别示例【非卷积与卷积实现】
2019/12/19 Python
python判断变量是否为列表的方法
2020/09/17 Python
html5/css3响应式页面开发总结
2018/10/16 HTML / CSS
html5教程画矩形代码分享
2013/12/04 HTML / CSS
微软英国官方网站:Microsoft英国
2016/10/15 全球购物
英国时尚高尔夫服装购物网站:Trendy Golf
2020/01/10 全球购物
css animation配合SVG制作能量流动效果
2021/03/24 HTML / CSS
应届生会计电算化求职信
2013/10/03 职场文书
《阳光》教学反思
2014/02/23 职场文书
防灾减灾活动总结
2014/08/30 职场文书
先进单位申报材料
2014/12/25 职场文书
自主招生自荐信格式范文
2015/03/25 职场文书
超市员工管理制度
2015/08/06 职场文书
中学教师教学工作总结
2015/08/13 职场文书