PHP 生成水印图片
这段时间因工作需要,学习了下用PHP来给背景图上添加公司logo,宣传语之类的图片合并功能。话不多说,直接上代码。
<?php public function getImage()
{
$data_set = array(
"text" => "这是测试文字"
); // 项目根目录
$path = __DIR__."/路径/"; // 背景图
$tem_bg = __DIR__."/项目存放背景图得路径/背景图.jpg"; // 最终合成图片得路径和名字
$final_path = "/img/.../...之类得路径/用户ID-bg.jpg"; $bg = $path.$final_path;
copy($tem_bg, $bg); // 复制图片
list($bgWidth, $bgHeight) = getimagesize($bg); // 获取图片宽高 // 字体文件路径
$path_src = __DIR__."/字体文件路径"; // 如果是需要生成文字图片,则调用下面方法,生成文字图片,再合成
$text_image = $this->text_image_png($path, $path_src, $data_set); // 获取文字图片得宽高
list($textWidth, $textHeight) = getimagesize($text_image); // 将背景图和文字图合成
$this->synthetic($bg, 'jpg', $bgWidth, $bgHeight, $text_image, $textHeight, $textWidth, "bottom-center", 0, 210);
unlink($text_image); // 删除临时合成得文字图片 // 如果不需要生成文字图片,直接使用现有的图片,则执行下面的,这2种方式可共存
$image = __DIR__."/图片路径/xxx.png";
list($logoWidth, $logoHeight) = getimagesize($image);
// 将背景图和文字图合成
$this->synthetic($bg, 'jpg', $bgWidth, $bgHeight, $image, $logoHeight, $logoWidth, "bottom-center", 0, 210, 0, 10); // 如果需要合成多个图片,那就执行多次$this->synthetic()方法 return array("width" => $bgWidth, "height" => $bgHeight, "path" => $bg_name); // path就是合成后图片的路径
} /**
* 生成文字图片
* @param $path 项目根目录
* @param $font_path 字体文件路径
* @param $data_set 需要生成文字图片的文字
* @return string
*/
public function text_image_png($path, $font_path, $data_set)
{
$bgwidth = 640; // 文字图片的宽
$bgheight = 500; // 文字图片的高
$block = imagecreatetruecolor($bgwidth, $bgheight);//建立一个画板
$bg = imagecolorallocatealpha($block , 255 , 255 , 255 , 127);// 拾取一个完全透明的颜色,不要用imagecolorallocate拾色
$color = imagecolorallocate($block,137,54,20); //字体拾色
imagealphablending($block , false);//关闭混合模式,以便透明颜色能覆盖原画板
imagefill($block , 0 , 0 , $bg);//填充
$font_file = $font_path.'/fonts/simhei.ttf'; // 字体文件 $color = imagecolorallocate($block,255,228,116); //字体拾色 // 文字
$text = $data_set["text"];
imagettftext($block,50,0,260,150,$color,$font_file,$text); // 向图像写入文本 imagesavealpha($block , true);//设置保存png时保留透明通道信息
$image_path = $path."/临时文件路径/text.png";
imagepng($block, $image_path);//生成图片
imagedestroy($block); // 销毁画板 return $image_path;
} /**
* 合并图片
*
* @param $image // 背景图
* @param $mimeType // 合成后的图片类型
* @param $imgWidth // 背景的宽
* @param $imgHeight // 背景的高
* @param $watermark // 需要合成的图
* @param $watermarkHeight // 需要合成的高
* @param $watermarkWidth // 需要合成的宽
* @param string $position // 居中类型
* @param int $mt // 设置margin-top值
* @param int $mb // 设置margin-bottom值
* @param int $ml // 设置margin-left值
* @param int $mr // 设置margin-right值
* @param string $watermakMimeType // 合成后图片的类型
* @throws \Exception
*/
public function synthetic($image, $mimeType, $imgWidth, $imgHeight, $watermark, $watermarkHeight, $watermarkWidth, $position = "center", $mt = 0, $mb = 0, $ml = 0, $mr = 0, $watermakMimeType = "png")
{
// Calculate the watermark position
switch ($position) {
case "center":
$marginBottom = round($imgHeight / 2);
$marginRight = round($imgWidth / 2) - round($watermarkWidth / 2);
break; case "top-left":
$marginBottom = round($imgHeight - $watermarkHeight);
$marginRight = round($imgWidth - $watermarkWidth);
break; case "bottom-left":
$marginBottom = 5;
$marginRight = round($imgWidth - $watermarkWidth);
break; case "top-right":
$marginBottom = round($imgHeight - $watermarkHeight);
$marginRight = 5;
break; case "bottom-center":
$marginBottom = $mb;
$marginRight = round($imgWidth / 2) - round($watermarkWidth / 2) + $mr;
break; default:
$marginBottom = 2;
$marginRight = 2;
break;
} if($watermakMimeType == "png") {
$watermark = imagecreatefrompng($watermark); // 生成png图片
} else {
$watermark = imagecreatefromjpeg($watermark); // 生成jpg图片
} switch ($mimeType) {
case "jpeg":
case "jpg":
$createImage = imagecreatefromjpeg($image);
break; case "png":
$createImage = imagecreatefrompng($image);
break; case "gif":
$createImage = imagecreatefromgif($image);
break; default:
$createImage = imagecreatefromjpeg($image);
break;
} $sx = imagesx($watermark);
$sy = imagesy($watermark);
imagecopy(
$createImage,
$watermark,
imagesx($createImage) - $sx - $marginRight,
imagesy($createImage) - $sy - $marginBottom,
0,
0,
imagesx($watermark),
imagesy($watermark)
); // 拷贝图像的一部分 switch ($mimeType) {
case "jpeg":
case "jpg":
imagejpeg($createImage, $image); // 以 jpeg 格式将图像输出到浏览器或文件
break; case "png":
imagepng($createImage, $image); // 以 PNG 格式将图像输出到浏览器或文件
break; case "gif":
imagegif($createImage, $image); // 以 gif 格式将图像输出到浏览器或文件
break; default:
throw new \Exception("A watermark can only be applied to: jpeg, jpg, gif, png images ");
break;
}
}
以上就是将多个图片合成一张图片的过程。
PHP 生成水印图片的更多相关文章
- PHP生成随机水印图片
基于PHP的GD图形库,自己生成一张图片.仅限初识GD库,实例学习. 一.需求 网站的布局用到了类似慕课网课程列表的风格,每一个课程是一个banner图,图下面是标题加简介.因为课程的数量较大没有为所 ...
- C#(.net)水印图片的生成
/* * * 使用说明: * 建议先定义一个WaterImage实例 * 然后利用实例的属性,去匹配需要进行操作的参数 * 然后定义一个WaterImageManage实例 * 利用WaterI ...
- PHP 上传图片,生成水印,支持文字, gif, png
//admin_upfile.php <html> <meta http-equiv="Content-Type" content="text/html ...
- 前端水印图片及文字js教程
前端水印图片文字教程如下,复制代码修改图片地址即可看到效果,工作中遇到总结的,喜欢就关注下哦: <!DOCTYPE html><html> <head> <m ...
- PHP验证码生成及图片处理(GD库)
GD库是php处理图形的扩展库,GD库提供了一系列用来处理图片的API,使用GD库可以处理图片,或者生成图片,也可以给图片加水印. 本章实现了生成图片并绘画各种形状.图片的压缩.中文字符水印及图片水印 ...
- php生成文字图片效果
php生成文字图片效果最近看到php的GD功能,试着做了一个基本生成文字图片效果的代码: 显示文字图片页面:demo.php<?php$str = $_REQUEST['str'] ? $_RE ...
- [转载]java操作word生成水印
应用场景 为了保护版权或辨别文件的真伪,有时需要在生成的Word文件中动态添加水印,PageOffice组件的WaterMark类就封装了给在线编辑的Word文件添加水印这一功能,调用接口非常简单. ...
- [原创]java操作word生成水印
应用场景 为了保护版权或辨别文件的真伪,有时需要在生成的Word文件中动态添加水印,PageOffice组件的WaterMark类就封装了给在线编辑的Word文件添加水印这一功能,调用接口非常简单. ...
- php课程 8-28 php如何绘制生成显示图片
php课程 8-28 php如何绘制生成显示图片 一.总结 一句话总结:gd库轻松解决 1.php图片操作生成的图的两种去向是什么? 一种在页面直接输出,一种存进本地磁盘 2.php操作图片的库有哪些 ...
随机推荐
- SpringBoot 4.SpringBoot 整合 devtools 实现热部署
一.添加 devtools 依赖 <!-- Spring boot 热部署 : 此热部署会遇到 java.lang.ClassCastException 异常 --> <!-- op ...
- 关于idea easyui 引入css js
1.引用官方网站 <link rel="stylesheet" type="text/css" href="http://www.w3cscho ...
- SQL Server中的完全连接(full join)
一.建库和建表 create database scort use scort create table emp ( empno int primary key, ename ), sal int, ...
- 五、同一台MySQL服务器启动多个端口-为读写分离做准备
一.安装数据库 https://www.cnblogs.com/huiyi0521/p/10113280.html 二.使用 mysql 命令为 root 用户授权 mysql 远程连接服务 mysq ...
- python工具使用笔记
1.pip pip是Python官方推荐的包管理工具,在doc界面直接使用pip或者pip3命令即可,例如安装gensim: C:\Users\kayan.sjc>pip3 install -- ...
- Xamarin + MvvmCross 简单事例 Part 2
MvvmCross 说起MvvmCross,要先说到Mvvm,Mvvm是Mvc框架的一种变形.对应的分别为Model.View和ViewModel层.三层之间的关系是这样的: Model层为数据层,实 ...
- hdu-1058(map)
题意:输出第n个能拆分成由,2,3,5,7中的一个或者多个组成的数: 解题思路:a[i+1]=a[i]*2;a[i+2]=a[i]*3;a[i+3]=a[i]*5;a[i+4]=a[i]*7;然后把重 ...
- WMS工作原理
图1:创建窗口 图2:通信过程 我们知道其实任何一个窗口的创建,最终都是会创建一个 ViewRootImpl对象.ViewRootImpl 是一很重要的类,类似 ActivityThread 负责跟A ...
- redis哨兵集群+spring boot 2.×
Ubuntu集群构建篇 redis-cli:不跟参数,默认访问localhost:6379端口,无密码登陆 redis-cli -h ${host} -p ${port} -a ${password} ...
- windows常用服务命令
windows运行打开服务命令的方法 :在开始->运行,输入以下命令 gpedit.msc-----组策略 sndrec32-------录音机 Nslookup-------IP地址侦测器 e ...