基于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网站基础优化方法小结
Sep 29 PHP
php中将网址转换为超链接的函数
Sep 02 PHP
PHP取整函数:ceil,floor,round,intval的区别详细解析
Aug 31 PHP
php静态文件生成类实例分析
Jan 03 PHP
PHP中的随机性 你觉得自己幸运吗?
Jan 22 PHP
php数据访问之增删改查操作
May 09 PHP
php获得文件夹下所有文件的递归算法的简单实例
Nov 01 PHP
简述php环境搭建与配置
Dec 05 PHP
利用PHPExcel读取Excel的数据和导出数据到Excel
May 12 PHP
PHP实现浏览器格式化显示XML的方法示例
Jan 22 PHP
PHP使用HTML5 FileApi实现Ajax上传文件功能示例
Jul 01 PHP
ThinkPHP 5 AJAX跨域请求头设置实现过程解析
Oct 28 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
提问的智慧(2)
2006/10/09 PHP
php shell超强免杀、减少体积工具实现代码
2012/10/16 PHP
PHP函数addslashes和mysql_real_escape_string的区别
2014/04/22 PHP
php对文件进行hash运算的方法
2015/04/03 PHP
PHP页面输出搜索后跳转下一页的处理方法
2016/09/30 PHP
javascript实现的动态文字变换
2007/07/28 Javascript
node.js使用npm 安装插件时提示install Error: ENOENT报错的解决方法
2014/11/20 Javascript
JavaScript实现图片自动加载的瀑布流效果
2016/04/11 Javascript
创建基于Bootstrap的下拉菜单的DropDownList的JQuery插件
2016/06/02 Javascript
关于在Servelet中如何获取当前时间的操作方法
2016/06/28 Javascript
JCrop+ajaxUpload 图像切割上传的实例代码
2016/07/20 Javascript
一种基于浏览器的自动小票机打印实现方案(js版)
2016/07/26 Javascript
jQuery实现弹窗居中效果类似alert()
2017/02/27 Javascript
Vue.js实现移动端短信验证码功能
2017/03/29 Javascript
详解Angular 开发环境搭建
2017/06/22 Javascript
微信小程序中如何使用flyio封装网络请求
2019/07/03 Javascript
七行JSON代码把你的网站变成移动应用过程详解
2019/07/09 Javascript
vue实现列表滚动的过渡动画
2020/06/29 Javascript
深入学习Python中的上下文管理器与else块
2017/08/27 Python
python实现微信发送邮件关闭电脑功能
2018/02/22 Python
Python提取频域特征知识点浅析
2019/03/04 Python
解决Jupyter Notebook开始菜单栏Anaconda下消失的问题
2020/04/13 Python
tensorflow从ckpt和从.pb文件读取变量的值方式
2020/05/26 Python
python实现数学模型(插值、拟合和微分方程)
2020/11/13 Python
李维斯牛仔裤英国官方网站:Levi’s英国
2019/10/10 全球购物
Linux操作面试题
2012/05/16 面试题
Ruby如何进行文件操作
2014/07/17 面试题
临床医学专业学生的自我评价分享
2013/11/21 职场文书
大学生冰淇淋店商业计划书
2014/01/14 职场文书
师范教师专业大学生职业生涯规划范文
2014/03/02 职场文书
学员自我鉴定
2014/03/19 职场文书
学习雷锋主题班会
2015/08/14 职场文书
基于Nginx实现限制某IP短时间访问次数
2021/03/31 Servers
MySQL EXPLAIN输出列的详细解释
2021/05/12 MySQL
Spring实现内置监听器
2021/07/09 Java/Android
mysql字段为NULL索引是否会失效实例详解
2022/05/30 MySQL