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 相关文章推荐
Discuz 模板语句分析及知识技巧
Aug 21 PHP
php利用cookie实现访问次数统计代码
May 19 PHP
解析php addslashes()与addclashes()函数的区别和比较
Jun 24 PHP
PHP关于IE下的iframe跨域导致session丢失问题解决方法
Oct 10 PHP
分享下页面关键字抓取www.icbase.com站点代码(带asp.net参数的)
Jan 30 PHP
ThinkPHP的I方法使用详解
Jun 18 PHP
PHP 验证登陆类分享
Mar 13 PHP
ThinkPHP进程计数类Process用法实例详解
Sep 25 PHP
Yii基于数组和对象的Model查询技巧实例详解
Dec 28 PHP
详解WordPress中调用评论模板和循环输出评论的PHP函数
Jan 05 PHP
PHP实现的下载远程文件类定义与用法示例
Jul 05 PHP
PHP基于IMAP收取邮件的方法示例
Aug 07 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
phpwind中的数据库操作类
2007/01/02 PHP
使用CodeIgniter的类库做图片上传
2014/06/12 PHP
js写一个弹出层并锁屏效果实现代码
2012/12/07 Javascript
JQuery的Ajax中Post方法传递中文出现乱码的解决方法
2014/10/21 Javascript
使用Plupload实现直接上传附件至七牛云存储
2014/12/26 Javascript
javascript类型系统 Array对象学习笔记
2016/01/09 Javascript
总结jQuery插件开发中的一些要点
2016/05/16 Javascript
Bootstrap教程JS插件弹出框学习笔记分享
2016/05/17 Javascript
分享JS代码实现鼠标放在输入框上输入框和图片同时更换样式
2016/09/01 Javascript
原生JS取代一些JQuery方法的简单实现
2016/09/20 Javascript
JS正则表达式验证账号、手机号、电话和邮箱是否合法
2017/03/08 Javascript
ES6学习之变量的两种命名方法示例
2017/07/18 Javascript
浅谈gulp创建完整的项目流程
2017/12/20 Javascript
用node-webkit把web应用打包成桌面应用(windows环境)
2018/02/01 Javascript
浅谈layer弹出层按钮颜色修改方法
2019/09/11 Javascript
javascript实现画板功能
2020/04/12 Javascript
JavaScript中reduce()的5个基本用法示例
2020/07/19 Javascript
微信小程序实现自定义底部导航
2020/11/18 Javascript
python中使用print输出中文的方法
2018/07/16 Python
python中pygame安装过程(超级详细)
2019/08/04 Python
Django单元测试中Fixtures用法详解
2020/02/25 Python
迪斯尼商品官方网站:ShopDisney
2016/08/01 全球购物
师范大学毕业自我鉴定
2013/11/21 职场文书
女大学生个人求职信
2013/12/09 职场文书
中国文明网签名寄语
2014/01/18 职场文书
财务学生的职业生涯发展
2014/02/11 职场文书
感恩寄语大全
2014/04/11 职场文书
2015社区精神文明建设工作总结
2015/04/21 职场文书
毕业设计致谢词
2015/05/14 职场文书
2015年学校信息技术工作总结
2015/05/25 职场文书
步步惊心观后感
2015/06/12 职场文书
庆祝教师节主持词
2015/07/06 职场文书
生鲜超市—未来中国最具有潜力零售业态
2019/08/02 职场文书
MySQL之高可用集群部署及故障切换实现
2021/04/22 MySQL
解决Pytorch dataloader时报错每个tensor维度不一样的问题
2021/05/28 Python
Tomcat配置访问日志和线程数
2022/05/06 Servers