PHP实现随机生成水印图片功能


Posted in PHP onMarch 22, 2017

基于PHP的GD图形库,自己生成一张图片。仅限初识GD库,实例学习。

一、需求

网站的布局用到了类似慕课网课程列表的风格,每一个课程是一个banner图,图下面是标题加简介。因为课程的数量较大没有为所有的课程设计专门的banner,所以需要按照一定的规则,来自己生成图片(本打算用div布局来解决,但div+img在响应式布局中不是很好控制)。

生成的效果图:

PHP实现随机生成水印图片功能

二、工具&素材

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版(1)
Oct 09 PHP
人大复印资料处理程序_输入篇
Oct 09 PHP
php 获得汉字拼音首字母的函数
Aug 01 PHP
PHP 之Section与Cookie使用总结
Sep 14 PHP
通过curl模拟post和get方式提交的表单类
Apr 23 PHP
ThinkPHP中处理表单中的注意事项
Nov 22 PHP
php解析http获取的json字符串变量总是空白null
Mar 02 PHP
php使用cookie实现记住登录状态
Apr 27 PHP
ThinkPHP模型详解
Jul 27 PHP
WordPress中获取指定分类及其子分类下的文章数目
Dec 31 PHP
PHP面向对象程序设计高级特性详解(接口,继承,抽象类,析构,克隆等)
Dec 02 PHP
php检查函数必传参数是否存在的实例详解
Aug 28 PHP
php session的应用详细介绍
Mar 22 #PHP
php 开发中加密的几种方法总结
Mar 22 #PHP
详解Yii2高级版引入bootstrap.js的一个办法
Mar 21 #PHP
详解Yii2.0 rules验证规则集合
Mar 21 #PHP
php连接mysql数据库
Mar 21 #PHP
Thinkphp实现站点静态化的方法详解
Mar 21 #PHP
php登录超时检测功能实例详解
Mar 21 #PHP
You might like
比较时间段一与时间段二是否有交集的php函数
2011/05/31 PHP
PHP使用GIFEncoder类处理gif图片实例
2014/07/01 PHP
PHP实现图片上传并压缩
2015/12/22 PHP
在模板页面的js使用办法
2010/04/01 Javascript
IE6,IE7,IE8下使用Javascript记录光标选中范围(已补全)
2011/08/28 Javascript
seajs1.3.0源码解析之module依赖有序加载
2012/11/07 Javascript
jquery click([data],fn)使用方法实例介绍
2013/07/08 Javascript
jquery mobile事件多次绑定示例代码
2013/09/13 Javascript
js检测网络是否具体连接功能的代码
2014/05/23 Javascript
防止登录页面出现在frame中js代码
2014/07/22 Javascript
Javascript正则控制文本框只能输入整数或浮点数
2014/09/02 Javascript
js+CSS实现弹出居中背景半透明div层的方法
2015/02/26 Javascript
Javascript中arguments用法实例分析
2015/06/13 Javascript
轻松学习jQuery插件EasyUI EasyUI表单验证
2015/12/01 Javascript
javascript类型系统 Array对象学习笔记
2016/01/09 Javascript
JS简单实现DIV相对于浏览器固定位置不变的方法
2016/06/17 Javascript
微信小程序实现图片上传功能
2018/05/28 Javascript
详解react native页面间传递数据的几种方式
2018/11/07 Javascript
微信小程序实现的绘制table表格功能示例
2019/04/26 Javascript
js动态获取时间的方法分析
2019/08/02 Javascript
[03:56]还原FTP电影首映式 DOTA2群星拼出遗迹世界
2014/03/26 DOTA
[02:51]DOTA2 2015国际邀请赛中国区预选赛第一日战报
2015/05/27 DOTA
python将xml xsl文件生成html文件存储示例讲解
2013/12/03 Python
python3.3使用tkinter开发猜数字游戏示例
2014/03/14 Python
Python利用Beautiful Soup模块修改内容方法示例
2017/03/27 Python
Python中最大最小赋值小技巧(分享)
2017/12/23 Python
python3+PyQt5 创建多线程网络应用-TCP客户端和TCP服务器实例
2019/06/17 Python
Django中使用session保持用户登陆连接的例子
2019/08/06 Python
哪种Python框架适合你?简单介绍几种主流Python框架
2020/08/04 Python
解决pytorch 模型复制的一些问题
2021/03/03 Python
CSS3属性box-sizing使用指南
2014/12/09 HTML / CSS
软件工程师面试题
2012/06/25 面试题
圣诞节活动策划方案
2014/06/09 职场文书
综治目标管理责任书
2015/05/11 职场文书
如何利用React实现图片识别App
2022/02/18 Javascript
css3 选择器
2022/05/11 HTML / CSS