基于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 相关文章推荐
GD输出汉字的函数的分析
Oct 09 PHP
用穿越火线快速入门php面向对象
Feb 22 PHP
php数据结构与算法(PHP描述) 快速排序 quick sort
Jun 21 PHP
div li的多行多列 无刷新分页示例代码
Oct 16 PHP
PHP把数字转成人民币大写的函数分享
Jun 30 PHP
Destoon实现多表查询示例
Aug 21 PHP
PHP编程中尝试程序并发的几种方式总结
Mar 21 PHP
php自定义时间转换函数示例
Dec 07 PHP
php-app开发接口加密详解
Apr 18 PHP
PHP设计模式之单例模式原理与实现方法分析
Apr 25 PHP
再谈Yii Framework框架中的事件event原理与应用
Apr 07 PHP
PHP生成图表pChart的示例解析
Jul 31 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
农民C键的运用技巧
2020/03/04 星际争霸
Fatal error: Call to undefined function curl_init()解决方法
2010/04/09 PHP
使用PHP+AJAX让WordPress动态加载文章的教程
2015/12/11 PHP
PHP面向对象程序设计实例分析
2016/01/26 PHP
laravel执行php artisan migrate报错的解决方法
2019/10/09 PHP
phpstudy隐藏index.php的方法
2020/09/21 PHP
使用jquery mobile做幻灯播放效果实现步骤
2013/01/04 Javascript
JS调用Android、Ios原生控件
2017/01/06 Javascript
Reactjs实现通用分页组件的实例代码
2017/01/19 Javascript
jQuery自定义多选下拉框效果
2017/06/19 jQuery
微信小程序商品详情页规格属性选择示例代码
2017/10/30 Javascript
创建Vue项目以及引入Iview的方法示例
2018/12/03 Javascript
使用rollup打包JS的方法步骤
2018/12/05 Javascript
Angular(5.2-&gt;6.1)升级小结
2018/12/27 Javascript
react 移动端实现列表左滑删除的示例代码
2019/07/04 Javascript
详解简单易懂的 ES6 Iterators 指南和示例
2019/09/24 Javascript
Python的净值数据接口调用示例分享
2016/03/15 Python
Python用sndhdr模块识别音频格式详解
2018/01/11 Python
Python基于csv模块实现读取与写入csv数据的方法
2018/01/18 Python
pandas分区间,算频率的实例
2019/07/04 Python
HTML的form表单和django的form表单
2019/07/25 Python
Python 使用matplotlib模块模拟掷骰子
2019/08/08 Python
python多线程扫描端口(线程池)
2019/09/04 Python
linux 下python多线程递归复制文件夹及文件夹中的文件
2020/01/02 Python
pytorch的梯度计算以及backward方法详解
2020/01/10 Python
Python进阶之迭代器与迭代器切片教程
2020/01/29 Python
opencv中图像叠加/图像融合/按位操作的实现
2020/04/01 Python
Python如何通过百度翻译API实现翻译功能
2020/04/02 Python
Python selenium模拟手动操作实现无人值守刷积分功能
2020/05/13 Python
学习Python需要哪些工具
2020/09/04 Python
简单总结CSS3中视窗单位Viewport的常见用法
2016/02/04 HTML / CSS
HTML 5 标签、属性、事件及浏览器兼容性速查表 附打包下载
2012/10/20 HTML / CSS
LORAC官网:美国彩妆品牌
2019/08/27 全球购物
KEEN美国官网:美国人气户外休闲鞋品牌
2021/03/09 全球购物
文艺晚会策划方案
2014/06/11 职场文书
2014年党课学习心得体会
2014/07/08 职场文书