设为首页收藏本站
网站公告 | 这是第一条公告
     

 找回密码
 立即注册
缓存时间20 现在时间20 缓存数据 父母亲存在的意义不是给予孩子舒适和富裕的生活,而是,当你想到你的父母时,你的内心会充满力量,会感受到温暖,从而拥有克服困难的勇气和能力,以此获得人生真正的乐趣和自由。晚安!

父母亲存在的意义不是给予孩子舒适和富裕的生活,而是,当你想到你的父母时,你的内心会充满力量,会感受到温暖,从而拥有克服困难的勇气和能力,以此获得人生真正的乐趣和自由。晚安!

查看: 1222|回复: 0

基于PHP实现生成随机水印图片

[复制链接]

  离线 

TA的专栏

  • 打卡等级:热心大叔
  • 打卡总天数:203
  • 打卡月天数:0
  • 打卡总奖励:3146
  • 最近打卡:2023-08-27 07:10:01
等级头衔

等級:晓枫资讯-上等兵

在线时间
0 小时

积分成就
威望
0
贡献
367
主题
345
精华
0
金钱
4233
积分
740
注册时间
2022-12-23
最后登录
2025-5-31

发表于 2023-2-12 20:41:14 | 显示全部楼层 |阅读模式
基于PHP的GD图形库,自己生成一张图片。仅限初识GD库,实例学习。
一、需求

网站的布局用到了类似慕课网课程列表的风格,每一个课程是一个banner图,图下面是标题加简介。因为课程的数量较大没有为所有的课程设计专门的banner,所以需要按照一定的规则,来自己生成图片(本打算用div布局来解决,但div+img在响应式布局中不是很好控制)。
二、工具&素材

1.PHP开启GD图形库扩展

2.准备多个小的水印图

3.获取预生成图片的背景色RGB值
三、代码

生成图片的过程,代码中做了详细的注释。
  1. class GenerateRandomImage
  2. {
  3.   /** @var integer 图片宽度 */
  4.   public $imgWidth = 272;
  5.   /** @var integer 图片高度 */
  6.   public $imgHeight = 162;
  7.   /** @var 根据type不同来生成不同的背景颜色,目前留个type分别为蓝色、紫色、黄色、绿色、灰色、土黄色 */
  8.   public $type = '';
  9.   /** @var 图片上要显示的文字 */
  10.   public $text = '';
  11.   /** @var integer 图片上文字的字体大小 */
  12.   public $fontSize = 16;

  13.   public function __construct($type, $text)
  14.   {
  15.     $this->type = $type;
  16.     $this->text = $text;
  17.   }
  18.   /**
  19.    * 创建生成随机图片
  20.    * @author bignerd
  21.    * @since 2017-03-21T14:49:41+0800
  22.    */
  23.   public function createImg()
  24.   {
  25.     /** @var 创建一个指定图片大小的空调色板
  26.     $image = imagecreate($this->imgWidth, $this->imgHeight);
  27.     $rgb  = $this->getBackground($this->type);
  28.     /** @var 为图片创建一个背景色 */
  29.     $backgroundColor = imagecolorallocate($image, $rgb['r'], $rgb['g'], $rgb['b']);
  30.     /** @var 创建文字白色字体 */
  31.     $textColor = imagecolorallocate($image, 255, 255, 255);
  32.     /** @var 字体文件路径 */
  33.     $font = $_SERVER['DOCUMENT_ROOT'].'/public/font/simhei.ttf';

  34.     $x = 18;//文字起始位置x坐标
  35.     $y = 50;//文字起始位置y坐标
  36.     /** 文字写入图片 */
  37.     $angle = 0;//角度0
  38.     imagettftext($image, $this->fontSize, $angle, $x, $y, $textColor, $font, $this->text);
  39.     /** @var 水印图片路径 **/
  40.     $waterImgPath = $this->randWaterImage();
  41.     /** @var 获取图片信息,返回值$waterInfo[2] 为图片类型常量 */
  42.     $waterInfo  = getimagesize($waterImgPath);
  43.     /** @var 将图片类型常量转换为真正的类型,如png */
  44.     $waterType  = image_type_to_extension($waterInfo[2], false);//获取文件类型

  45.     $createImageFunc = 'imagecreatefrom'.$waterType;
  46.     /** @var 创建一个水印图片的副本 $createImageFunc 为根据图片类型来动态生成预调用的创建图片函数*/
  47.     $mask = $createImageFunc($waterImgPath);
  48.     $posX = $this->imgWidth - $waterInfo[0];//水印图片,在目标图片中的位置的x坐标
  49.     $posY = $this->imgHeight - $waterInfo[1];//水印图片,在目标图片中的位置的y坐标
  50.     /** http请求响应类型设置为 image/png 以便直接显示为图片 */
  51.     header("Content-Type:image/png");
  52.     /** 水印图片复制到创建的image */
  53.     imagecopy($image, $mask, $posX, $posY, 0, 0, $waterInfo[0], $waterInfo[1]);
  54.     imagepng($image);//输入图片到浏览器或者文件
  55.     imagedestroy($image);//销毁图片
  56.   }
  57.   /**
  58.    * 图片背景颜色的rgb值
  59.    * @author bignerd
  60.    * @since 2017-03-21T14:50:16+0800
  61.    */
  62.   public function getBackground()
  63.   {
  64.     $background = [
  65.       '1'=>['r'=>0, 'g'=>160,'b'=>233],
  66.       '2'=>['r'=>198,'g'=>0, 'b'=>110],
  67.       '3'=>['r'=>237,'g'=>109,'b'=>0],
  68.       '4'=>['r'=>33, 'g'=>148,'b'=>75],
  69.       '5'=>['r'=>63, 'g'=>58, 'b'=>57],      
  70.       '6'=>['r'=>202,'g'=>162,'b'=>101],
  71.     ];
  72.     return $background[$this->type];
  73.   }
  74.   /**
  75.    * 随机水印图片路径
  76.    * @author bignerd
  77.    * @since 2017-03-21T14:51:00+0800
  78.    * @return 路径
  79.    */
  80.   public function randWaterImage()
  81.   {
  82.     $folder = [
  83.       '1'=>'product','2'=>'team','3'=>'architecture','4'=>'developer','5'=>'test','6'=>'engineer'
  84.     ];
  85.     $targetFolder = $_SERVER['DOCUMENT_ROOT'].'/public/images/role/'.$folder[$this->type].'/'.rand(1,38).'.png';
  86.     return $targetFolder;
  87.   }
  88. }

  89. $image = new GenerateRandomImage(1,"扛得住的MySql数据架构");
  90. $image->createImg();
复制代码
这样我们就可以直接在页面中使用 <img src="http://xxx.com/GenerateRandomImage.php" />来直接显示图片。
注意:过程中遇到过一个问题:如果水印图片是透明的png图片,那将水印图片复制到image中时,会显示为白色背景,与我们设定 的image背景无法透明融合,所以对随机的水印图片也需要做同样的颜色处理。
四、总结

这个小示例用简单的步骤来生成一张图片,直接显示在浏览器,也可以给imagepng加第二参数,也就是路径,以保存图片。所以学会示例中的几个GD库中的方法,就可以实现创建图片、为图片添加文字水印、或图片水印。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持晓枫资讯。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
晓枫资讯-科技资讯社区-免责声明
免责声明:以上内容为本网站转自其它媒体,相关信息仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同其观点或证实其内容的真实性。
      1、注册用户在本社区发表、转载的任何作品仅代表其个人观点,不代表本社区认同其观点。
      2、管理员及版主有权在不事先通知或不经作者准许的情况下删除其在本社区所发表的文章。
      3、本社区的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,举报反馈:点击这里给我发消息进行删除处理。
      4、本社区一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
      5、以上声明内容的最终解释权归《晓枫资讯-科技资讯社区》所有。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~
严禁发布广告,淫秽、色情、赌博、暴力、凶杀、恐怖、间谍及其他违反国家法律法规的内容。!晓枫资讯-社区
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|晓枫资讯--科技资讯社区 本站已运行

CopyRight © 2022-2025 晓枫资讯--科技资讯社区 ( BBS.yzwlo.com ) . All Rights Reserved .

晓枫资讯--科技资讯社区

本站内容由用户自主分享和转载自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

如有侵权、违反国家法律政策行为,请联系我们,我们会第一时间及时清除和处理! 举报反馈邮箱:点击这里给我发消息

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表