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 相关文章推荐
oracle资料库函式库
Oct 09 PHP
php+mysql写的简单留言本实例代码
Jul 25 PHP
PHP 文件类型判断代码
Mar 13 PHP
php获取ip的三个属性区别介绍(HTTP_X_FORWARDED_FOR,HTTP_VIA,REMOTE_ADDR)
Sep 23 PHP
实用的简单PHP分页集合包括使用方法
Oct 21 PHP
Windows中使用计划任务自动执行PHP程序实例
May 09 PHP
php获取从百度、谷歌等搜索引擎进入网站关键词的方法
Jul 08 PHP
smarty简单应用实例
Nov 03 PHP
给PHP开发者的编程指南 第一部分降低复杂程度
Jan 18 PHP
php 运算符与表达式详细介绍
Nov 30 PHP
关于PHP转换超过2038年日期出错的问题解决
Jun 28 PHP
详解PHP神奇又有用的Trait
Mar 25 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模板引擎Smarty的缓存使用总结
2014/04/24 PHP
Codeigniter出现错误提示Error with CACHE directory的解决方案
2014/06/12 PHP
PHP使用GIFEncoder类处理gif图片实例
2014/07/01 PHP
浅析iis7.5安装配置php环境
2015/05/10 PHP
基于PHP代码实现中奖概率算法可用于刮刮卡、大转盘等抽奖算法
2015/12/20 PHP
php监测数据是否成功插入到Mysql数据库的方法
2016/11/25 PHP
javascript Firefox与IE 替换节点的方法
2010/02/24 Javascript
基于jquery的loading 加载提示效果实现代码
2011/09/01 Javascript
js之onload事件的一点使用心得
2013/08/14 Javascript
jQuery操作DOM之获取表单控件的值
2015/01/23 Javascript
高性能JavaScript 重排与重绘(2)
2015/08/11 Javascript
jquery验证手机号是否正确实例讲解
2015/11/17 Javascript
jQuery DataTables插件自定义Ajax分页实例解析
2020/04/28 Javascript
JavaScript实现url参数转成json形式
2016/09/25 Javascript
ES6中数组array新增方法实例总结
2017/11/07 Javascript
vue代理和跨域问题的解决
2018/07/18 Javascript
vue实现双向绑定和依赖收集遇到的坑
2018/11/29 Javascript
Vue.js的复用组件开发流程完整记录
2018/11/29 Javascript
微信小程序点餐系统开发常见问题汇总
2019/08/06 Javascript
继承行为在 ES5 与 ES6 中的区别详解
2019/12/24 Javascript
JS定时器如何实现提交成功提示功能
2020/06/12 Javascript
一文秒懂nodejs中的异步编程
2021/01/28 NodeJs
如何运行.ipynb文件的图文讲解
2019/06/27 Python
python 视频逐帧保存为图片的完整实例
2019/12/10 Python
Python基于数列实现购物车程序过程详解
2020/06/09 Python
Python获取excel内容及相关操作代码实例
2020/08/10 Python
Python批量获取并保存手机号归属地和运营商的示例
2020/10/09 Python
英国最全面的橄榄球联盟门票网站:Live Rugby Tickets
2018/10/06 全球购物
董事长秘书岗位职责
2013/11/29 职场文书
房产转让协议书
2014/04/11 职场文书
幼儿评语大全
2014/04/30 职场文书
诉前财产保全担保书
2014/05/20 职场文书
国防教育标语
2014/10/08 职场文书
村党支部书记个人对照材料汇报
2014/10/26 职场文书
改进工作作风心得体会
2016/01/23 职场文书
PHP中国际化的字符串排序和比较对象详解
2021/08/23 PHP