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 相关文章推荐
PHP5 安装方法
Oct 09 PHP
用PHP函数解决SQL injection
Oct 09 PHP
常用表单验证类,有了这个,一般的验证就都齐了。
Dec 06 PHP
php将字符串转化成date存入数据库的两种方式
Apr 28 PHP
php将数组转换成csv格式文件输出的方法
Mar 14 PHP
Swoole-1.7.22 版本已发布,修复PHP7相关问题
Dec 31 PHP
PHP根据session与cookie用户登录状态操作类的代码
May 13 PHP
PHP上传Excel文件导入数据到MySQL数据库示例
Oct 25 PHP
2017年最新PHP经典面试题目汇总(上篇)
Mar 17 PHP
PHP 并发场景的几种解决方案
Jun 14 PHP
Laravel关系模型指定条件查询方法
Oct 10 PHP
PHP执行linux命令6个函数代码实例
Nov 24 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 curl获取301或302转向的网址问题的解决方法
2011/06/02 PHP
PHP array操作10个小技巧分享
2011/06/23 PHP
windows环境下php配置memcache的具体操作步骤
2013/06/09 PHP
PHP7.0版本备注
2015/07/23 PHP
php中让人头疼的浮点数运算分析
2016/10/10 PHP
javascript字典探测用户名工具
2006/10/05 Javascript
Array.prototype 的泛型应用分析
2010/04/30 Javascript
理解Javascript_15_作用域分配与变量访问规则,再送个闭包
2010/10/20 Javascript
JavaScript去掉数组中的重复元素
2011/01/13 Javascript
JavaScript 判断浏览器是否支持SVG的代码
2013/03/21 Javascript
深入理解Javascript中的循环优化
2013/11/09 Javascript
Javascript中this关键字的一些小知识
2015/03/15 Javascript
Zero Clipboard实现浏览器复制到剪贴板的方法(多个复制按钮)
2016/03/24 Javascript
JS实现显示带倒影的图片横排居中放大展示特效实例【测试可用】
2016/08/23 Javascript
Bootstrap笔记之缩略图、警告框实例详解
2017/03/09 Javascript
微信小程序实现图片上传、删除和预览功能的方法
2017/12/18 Javascript
node.js的http.createServer过程深入解析
2019/06/06 Javascript
js 下拉菜单点击旁边收起实现(踩坑记)
2019/09/29 Javascript
Layui实现数据表格默认全部显示(不要分页)
2019/10/26 Javascript
微信小程序以ssm做后台开发的实现示例
2020/04/08 Javascript
python数据结构树和二叉树简介
2014/04/29 Python
浅析Python中的join()方法的使用
2015/05/19 Python
Python中的深拷贝和浅拷贝详解
2015/06/03 Python
举例讲解Django中数据模型访问外键值的方法
2015/07/21 Python
python mqtt 客户端的实现代码实例
2019/09/25 Python
使用python-opencv读取视频,计算视频总帧数及FPS的实现
2019/12/10 Python
Columbia美国官网:美国著名的户外服装品牌
2016/11/24 全球购物
英国网络托管和域名领导者:Web Hosting UK
2017/10/15 全球购物
澳大利亚最大的网上油画销售画廊:Direct Art Australia
2018/04/15 全球购物
成龙洗发水广告词
2014/03/14 职场文书
门店业绩提升方案
2014/06/08 职场文书
财务会计专业自荐书
2014/06/30 职场文书
2015年党风廉政建设责任书
2015/01/29 职场文书
Python 实现绘制子图及子图刻度的变换等问题
2021/05/31 Python
使用RedisTemplat实现简单的分布式锁
2021/11/20 Redis
win11无线投屏在哪设置? win11无线投屏功能的使用方法
2022/04/08 数码科技