基于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 email邮箱正则
Oct 08 PHP
九个你必须知道而且又很好用的php函数和特点
Aug 08 PHP
php统计时间和内存使用情况示例分享
Mar 13 PHP
解密ThinkPHP3.1.2版本之独立分组功能应用
Jun 19 PHP
ThinkPHP让分页保持搜索状态的方法
Jul 02 PHP
php发送html格式文本邮件的方法
Jun 10 PHP
php简单生成一组与多组随机字符串的方法
May 09 PHP
PHP经典设计模式之依赖注入定义与用法详解
May 21 PHP
PHP实现关键字搜索后描红功能示例
Jul 03 PHP
在thinkphp5.0路径中实现去除index.php的方式
Oct 16 PHP
使用laravel根据用户类型来显示或隐藏字段
Oct 17 PHP
PHP实现随机发扑克牌
Apr 22 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
定制404错误页面,并发信给管理员的程序
2006/10/09 PHP
学习discuz php 引入文件的方法DISCUZ_ROOT
2009/06/21 PHP
thinkphp的URL路由规则与配置实例
2014/11/26 PHP
通过身份证号得到出生日期和性别的js代码
2009/11/23 Javascript
动态加载iframe时get请求传递中文参数乱码解决方法
2014/05/07 Javascript
jQuery晃动层特效实现方法
2015/03/09 Javascript
JavaScript常用标签和方法总结
2015/09/01 Javascript
不得不分享的JavaScript常用方法函数集(下)
2015/12/25 Javascript
基于javascript实现最简单的选项卡切换效果
2016/05/16 Javascript
vue插件draggable实现拖拽移动图片顺序
2018/12/01 Javascript
浅析vue cli3 封装Svgicon组件正确姿势(推荐)
2020/04/27 Javascript
Python中asyncore的用法实例
2014/09/29 Python
Python删除空文件和空文件夹的方法
2015/07/14 Python
Python 操作MySQL详解及实例
2017/04/30 Python
Python字典实现简单的三级菜单(实例讲解)
2017/07/31 Python
pycharm 在windows上编辑代码用linux执行配置的方法
2018/10/27 Python
新年快乐! python实现绚烂的烟花绽放效果
2019/01/30 Python
python3下pygame如何实现显示中文
2020/01/11 Python
浅谈Python中range与Numpy中arange的比较
2020/03/11 Python
django API 中接口的互相调用实例
2020/04/01 Python
在vscode中启动conda虚拟环境的思路详解
2020/12/25 Python
PyCharm 光标变成黑块的解决方式
2021/02/06 Python
HTML5页面直接调用百度地图API获取当前位置直接导航目的地的实现代码
2018/03/02 HTML / CSS
美国时装品牌:Nautica(诺帝卡)
2016/08/28 全球购物
微软澳洲官方网站:Microsoft Australia
2017/01/10 全球购物
I.T集团香港官方商城:ITeSHOP.com Hong Kong
2019/02/15 全球购物
经济实惠的名牌太阳镜和眼镜:Privé Revaux
2021/02/07 全球购物
用缩写的指针比较"if(p)" 检查空指针是否可靠?如果空指针的内部表达不是0会怎么样?
2014/01/05 面试题
房产委托公证书样本
2014/04/04 职场文书
节约用水倡议书
2014/04/16 职场文书
社区平安建设方案
2014/05/25 职场文书
清明节寄语2015
2015/03/23 职场文书
防暑降温通知书
2015/04/27 职场文书
幼儿园卫生保健制度
2015/08/05 职场文书
两行代码解决Jupyter Notebook中文不能显示的问题
2021/04/24 Python
Golang 实现 WebSockets 之创建 WebSockets
2022/04/24 Golang