基于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 mssql 时间格式问题
Jan 13 PHP
PHP 截取字符串 分别适合GB2312和UTF8编码情况
Feb 12 PHP
PHP array 的加法操作代码
Jul 24 PHP
探讨php中遍历二维数组的几种方法详解
Jun 08 PHP
基于empty函数的输出详解
Jun 17 PHP
解析VS2010利用VS.PHP插件调试PHP的方法
Jul 19 PHP
CodeIgniter框架过滤HTML危险代码
Jun 12 PHP
ThinkPHP模板判断输出Empty标签用法详解
Jun 30 PHP
PHP中的reflection反射机制测试例子
Aug 05 PHP
php常用的url处理函数总结
Nov 19 PHP
WordPress中转义HTML与过滤链接的相关PHP函数使用解析
Dec 22 PHP
Laravel框架中缓存的使用方法分析
Sep 06 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
php5编程中的异常处理详细方法介绍
2008/07/29 PHP
php学习之简单计算器实现代码
2011/06/09 PHP
php数组函数序列之array_slice() - 在数组中根据条件取出一段值,并返回
2011/11/07 PHP
ThinkPHP表单自动提交验证实例教程
2014/07/18 PHP
PHP语法自动检查的Vim插件
2014/08/11 PHP
php广告加载类用法实例
2014/09/23 PHP
TP(thinkPHP)框架多层控制器和多级控制器的使用示例
2018/06/13 PHP
Laravel5.1框架路由分组用法实例分析
2020/01/04 PHP
php文件上传原理与实现方法详解
2019/12/20 PHP
javascript 伪数组实现方法
2010/10/11 Javascript
中文输入法不触发onkeyup事件的解决办法
2014/07/09 Javascript
javascript实现复选框选中属性
2015/03/25 Javascript
angularjs表格分页功能详解
2016/01/21 Javascript
微信小程序 MINA文件结构
2016/10/17 Javascript
浅述节点的创建及常见功能的实现
2016/12/15 Javascript
基于Vuejs的搜索匹配功能实现方法
2018/03/03 Javascript
vue写一个组件
2018/04/09 Javascript
详解vuex 渐进式教程实例代码
2018/11/27 Javascript
如何进行微信公众号开发的本地调试的方法
2019/06/16 Javascript
python爬虫的工作原理
2017/03/05 Python
Python装饰器限制函数运行时间超时则退出执行
2019/04/09 Python
python判断自身是否正在运行的方法
2019/08/08 Python
详解如何减少python内存的消耗
2019/08/09 Python
TensorFlow tf.nn.softmax_cross_entropy_with_logits的用法
2020/04/19 Python
sqlalchemy实现时间列自动更新教程
2020/09/02 Python
HTML5、Select下拉框右边加图标的实现代码(增进用户体验)
2017/10/16 HTML / CSS
世界上最大的艺术和工艺用品商店:MisterArt.com
2018/07/13 全球购物
附答案的Java面试题
2012/11/19 面试题
大四毕业生学习总结的自我评价
2013/10/31 职场文书
爱祖国爱家乡演讲稿
2014/09/02 职场文书
机电专业毕业生自我鉴定2014
2014/10/04 职场文书
2015新年寄语(一句话)
2014/12/08 职场文书
2019个人工作态度自我评价
2019/04/24 职场文书
使用canvas实现雪花飘动效果的示例代码
2021/03/30 HTML / CSS
深度学习小工程练习之垃圾分类详解
2021/04/14 Python
SpringBoot 整合mongoDB并自定义连接池的示例代码
2022/02/28 MongoDB