我们经常能在图片上看到一些水印,一般分为图片、文字或者是两种一起的结合。那为什么要加水印呢?目的是为了防止别人盗图、造假或者标注出处等,保护图片原作者的著作权或是劳动成果。那么给图片加水印就非常有必要了。
怎么用PHP实现给图片加水印呢?
先来看看效果
使用GD库
使用GD库来实现效果
图像处理和 GD - 手册
正所谓授人以鱼不如授人以渔,光贴代码不讲实现过程的,都是耍流氓。所以下面我会写功能的实现过程、过程所需要用到的函数。
内容基本都是干货,需要用到的时候可以方便查阅资料
关键函数
下面是php实现两种水印方式的关键函数:
- imagettftext 用 TrueType 字体向图像写入文本
- imagecopymerge 拷贝并合并图像的一部分
两种水印的实现方式
图片水印
准备两张图片
- 原图
- 水印图
实现过程
-
在php中加载这两张图片,得到一个图像资源数据类型。
根据不同的图片格式,使用对应函数它们甚至可以加载一张来自网上的图片
-
读取图片宽高。
- imagesx 取得图像宽度
- imagesy 取得图像高度
- getimagesize 取得图像大小
- getimagesizefromstring 从字符串中获取图像尺寸信息
-
可能你会需要将水印图进行缩小或放大(如果不需要,可以跳过这一步)
等比例缩放- 计算缩放比例,根据想要缩放到的值(比如一张宽度是500px的图片,想缩小成50px)
- 计算缩放之后的宽高
- 创建一个新的图像资源(新图像的宽高等于缩放之后的宽高)
imagecreatetruecolor 新建一个真彩色图像 -
拷贝部分图像并调整大小
imagecopyresized 拷贝部分图像并调整大小参数说明(为了方便理解,我对参数进行了语义化)
imagecopyresized(目标图像资源, 原图资源, 粘到目标图像的起始水平坐标, 粘到目标图像的起始垂直坐标, 拷贝原图的起始水平坐标, 拷贝原图的起始垂直坐标, 最终想要的宽度, 最终想要的高度, 原图的宽度, 原图的高度);
-
使用
imagecopymerge
函数,拷贝水印图并合并到原图中。简单分析形参都有哪些(为了方便理解,我对参数进行了语义化)
imagecopymerge(原图资源, 水印图资源, 水印水平坐标, 水印垂直坐标, 拷贝水印图的起始水平坐标, 拷贝水印图的起始垂直坐标, 要拷贝的宽度, 要拷贝的高度, 水印透明度);- 水印透明度:透明度范围是0-100
-
输出图像
函数关键字image+图片格式
更多查看官方手册- imagejpeg 输出图象到浏览器或文件。
- imagepng
- imagegif
- imagewbmp
-
...
如果要输出到浏览器中,需要设置content-type头部
- header - 手册 发送原生 HTTP 头
- 常用对照表
-
释放图像资源
- imagedestroy 销毁图像
文字水印
简单分析形参都有哪些(为了方便理解,我对参数进行了语义化)
imagettftext(图像资源, 文字尺寸, 文字角度, 文字水平坐标, 文字垂直坐标, 文字颜色, 字体, 文本文字)
- 文字尺寸
GD库版本是1时,单位是像素(px),版本是2时,单位是点/磅(pt)
px,pt,em换算表
- 文字水平垂直基点位置
字符的左下角为基本点
- 文字颜色
颜色索引,通过imagecolorallocate函数创建
- 字体
字体的绝对路径
其他参考
如果这对你有帮助,或者能帮你节省一些时间,不如,点个赞吧~
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。