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 相关文章推荐
怎么使 Mysql 数据同步
Oct 09 PHP
PHP写的获取各搜索蜘蛛爬行记录代码
Aug 21 PHP
php gzip压缩输出的实现方法
Apr 27 PHP
微信公众平台天气预报功能开发
Jul 06 PHP
php中最简单的字符串匹配算法
Dec 16 PHP
THINKPHP2.0到3.0有哪些改进之处
Jan 04 PHP
PHP实现简单实用的验证码类
Jul 29 PHP
php获取远程文件内容的函数
Nov 02 PHP
PHP面向对象详解(三)
Dec 07 PHP
thinkphp3.2.3 分页代码分享
Jul 28 PHP
PHP新特性之字节码缓存和内置服务器
Aug 11 PHP
WordPress多语言翻译插件 - WPML使用教程
Apr 01 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
浅谈Eclipse PDT调试PHP程序
2014/06/09 PHP
php封装的pdo数据库操作工具类与用法示例
2019/05/08 PHP
点击下载链接 弹出页面实现代码
2009/10/01 Javascript
ExtJS下grid的一些属性说明
2009/12/13 Javascript
基于JQuery的密码强度验证代码
2010/03/01 Javascript
jquery ajax实现下拉框三级无刷新联动,且保存保持选中值状态
2013/10/29 Javascript
深入理解Javascript中的循环优化
2013/11/09 Javascript
jQuery取得iframe中元素的常用方法详解
2016/01/14 Javascript
javascript类型系统——日期Date对象全面了解
2016/07/13 Javascript
jquery根据一个值来选中select下的option实例代码
2016/08/29 Javascript
Bootstrap基本布局实现方法详解
2016/11/25 Javascript
webpack配置sass模块的加载的方法
2017/07/30 Javascript
JS实现电商放大镜效果
2017/08/24 Javascript
JavaScript闭包的简单应用
2017/09/01 Javascript
React学习之事件绑定的几种方法对比
2017/09/24 Javascript
从零开始搭建webpack+react开发环境的详细步骤
2018/05/18 Javascript
vue-cli3访问public文件夹静态资源报错的解决方式
2020/09/02 Javascript
夯基础之手撕javascript继承详解
2020/11/09 Javascript
Python3基础之函数用法
2014/08/13 Python
Python中字典创建、遍历、添加等实用操作技巧合集
2015/06/02 Python
简单谈谈python中的多进程
2016/11/06 Python
python面向对象实现名片管理系统文件版
2019/04/26 Python
Python爬取智联招聘数据分析师岗位相关信息的方法
2019/08/13 Python
Python生成器常见问题及解决方案
2020/03/21 Python
俄罗斯花园种植材料批发和零售网上商店:Беккер
2019/07/22 全球购物
Lovedrobe官网:英国领先的大码服装品牌
2019/09/19 全球购物
nohup的用法
2014/08/10 面试题
客服服务心得体会
2013/12/30 职场文书
学习标兵获奖感言
2014/02/20 职场文书
授权委托书范本
2014/04/03 职场文书
物理教育专业求职信
2014/06/25 职场文书
2014迎国庆标语大全
2014/09/19 职场文书
部门群众路线教育实践活动对照检查材料思想汇报
2014/10/07 职场文书
党的群众路线教育实践活动个人整改措施落实情况
2014/11/04 职场文书
高中生毕业评语
2014/12/30 职场文书
redis击穿 雪崩 穿透超详细解决方案梳理
2022/03/17 Redis