基于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 正则学习实例
Jul 30 PHP
PHP获取当前文件所在目录 getcwd()函数
May 13 PHP
PHP 获取MSN好友列表的代码(2009-05-14测试通过)
Sep 09 PHP
linux下为php添加curl扩展的方法
Jul 29 PHP
PHP设计模式之代理模式的深入解析
Jun 13 PHP
php缓存技术详细总结
Aug 07 PHP
php防止SQL注入详解及防范
Nov 12 PHP
递归删除一个节点以及该节点下的所有节点示例
Mar 19 PHP
php中操作memcached缓存进行增删改查数据的实现代码
Aug 15 PHP
PHP实现163邮箱自动发送邮件
Mar 29 PHP
PHP 根据key 给二维数组分组
Dec 09 PHP
php检查函数必传参数是否存在的实例详解
Aug 28 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
腾讯QQ php程序员面试题目整理
2010/06/08 PHP
PHP mysql与mysqli事务使用说明 分享
2013/08/17 PHP
CodeIgniter启用缓存和清除缓存的方法
2014/06/12 PHP
PHP设计模式之注册树模式分析
2018/01/26 PHP
PHP使用mongoclient简单操作mongodb数据库示例
2019/02/08 PHP
PHP 图片处理
2020/09/16 PHP
ECMAScript 基础知识
2007/06/29 Javascript
jquery中change()用法实例分析
2015/02/06 Javascript
微信中一些常用的js方法汇总
2015/03/12 Javascript
js实现二级菜单渐隐显示
2015/11/03 Javascript
JavaScript将DOM事件处理程序封装为event.js 出现的低级错误问题
2016/08/03 Javascript
js简单正则验证汉字英文及下划线的方法
2016/11/28 Javascript
js实现PC端根据IP定位当前城市地理位置
2017/02/22 Javascript
layui 弹出删除确认界面的实例
2019/09/06 Javascript
JS数组方法slice()用法实例分析
2020/01/18 Javascript
jQuery实现回到顶部效果
2020/10/19 jQuery
[53:18]Spirit vs Liquid Supermajor小组赛A组 BO3 第三场 6.2
2018/06/03 DOTA
零基础写python爬虫之使用Scrapy框架编写爬虫
2014/11/07 Python
Python获取Linux系统下的本机IP地址代码分享
2014/11/07 Python
让Python更加充分的使用Sqlite3
2017/12/11 Python
python爬虫URL重试机制的实现方法(python2.7以及python3.5)
2018/12/18 Python
python处理“
2019/06/10 Python
提升python处理速度原理及方法实例
2019/12/25 Python
解决Keras中Embedding层masking与Concatenate层不可调和的问题
2020/06/18 Python
HTML5在a标签内放置块级元素示例代码
2013/08/23 HTML / CSS
canvas之自定义头像功能实现代码示例
2017/09/29 HTML / CSS
eDreams巴西:廉价机票,酒店优惠和度假套餐
2017/04/14 全球购物
Expedia印度尼西亚站:预订酒店、廉价航班和度假套餐
2018/01/31 全球购物
ECHT官方网站:男女健身服
2020/02/14 全球购物
怎样在程序里获得一个空指针
2015/01/24 面试题
《沉香救母》教学反思
2014/04/19 职场文书
《会走路的树》教后反思
2014/04/19 职场文书
七一建党节演讲稿
2014/09/11 职场文书
汽车机电维修工求职信
2014/09/30 职场文书
交通事故死亡赔偿协议书
2014/12/03 职场文书
先进人物事迹材料
2014/12/29 职场文书