我们经常能在图片上看到一些水印,一般分为图片文字或者是两种一起的结合。那为什么要加水印呢?目的是为了防止别人盗图、造假或者标注出处等,保护图片原作者的著作权或是劳动成果。那么给图片加水印就非常有必要了。

怎么用PHP实现给图片加水印呢?

先来看看效果
watermark

使用GD库

使用GD库来实现效果
图像处理和 GD - 手册
正所谓授人以鱼不如授人以渔,光贴代码不讲实现过程的,都是耍流氓。所以下面我会写功能的实现过程、过程所需要用到的函数。

内容基本都是干货,需要用到的时候可以方便查阅资料

关键函数

下面是php实现两种水印方式的关键函数:

两种水印的实现方式

图片水印

准备两张图片

  • 原图
  • 水印图

实现过程

  1. 在php中加载这两张图片,得到一个图像资源数据类型。
    根据不同的图片格式,使用对应函数

    它们甚至可以加载一张来自网上的图片
  2. 读取图片宽高。

  3. 可能你会需要将水印图进行缩小或放大(如果不需要,可以跳过这一步)
    等比例缩放

    1. 计算缩放比例,根据想要缩放到的值(比如一张宽度是500px的图片,想缩小成50px)
    2. 计算缩放之后的宽高
    3. 创建一个新的图像资源(新图像的宽高等于缩放之后的宽高)
      imagecreatetruecolor 新建一个真彩色图像
    4. 拷贝部分图像并调整大小
      imagecopyresized 拷贝部分图像并调整大小

      参数说明(为了方便理解,我对参数进行了语义化)
      imagecopyresized(目标图像资源, 原图资源, 粘到目标图像的起始水平坐标, 粘到目标图像的起始垂直坐标, 拷贝原图的起始水平坐标, 拷贝原图的起始垂直坐标, 最终想要的宽度, 最终想要的高度, 原图的宽度, 原图的高度);
  4. 使用imagecopymerge函数,拷贝水印图并合并到原图中。

    简单分析形参都有哪些(为了方便理解,我对参数进行了语义化)
    imagecopymerge(原图资源, 水印图资源, 水印水平坐标, 水印垂直坐标, 拷贝水印图的起始水平坐标, 拷贝水印图的起始垂直坐标, 要拷贝的宽度, 要拷贝的高度, 水印透明度);
    • 水印透明度:透明度范围是0-100
  5. 输出图像
    函数关键字image+图片格式 更多查看官方手册

    • imagejpeg 输出图象到浏览器或文件。
    • imagepng
    • imagegif
    • imagewbmp
    • ...

      如果要输出到浏览器中,需要设置content-type头部
    • header - 手册 发送原生 HTTP 头
    • 常用对照表
  6. 释放图像资源

文字水印

简单分析形参都有哪些(为了方便理解,我对参数进行了语义化)

imagettftext(图像资源, 文字尺寸, 文字角度, 文字水平坐标, 文字垂直坐标, 文字颜色, 字体, 文本文字)
  • 文字尺寸

GD库版本是1时,单位是像素(px),版本是2时,单位是点/磅(pt)
px,pt,em换算表

  • 文字水平垂直基点位置

字符的左下角为基本点

  • 文字颜色

颜色索引,通过imagecolorallocate函数创建

  • 字体

字体的绝对路径

其他参考


如果这对你有帮助,或者能帮你节省一些时间,不如,点个赞吧~

原文地址


jayce
41 声望3 粉丝

十年饮冰,难凉热血。