PHP图片加水印:图形叠加与文字水印代码实现

周末不加班
周末不加班
发布时间:2026-10-13| 6人浏览过
原创

本文介绍如何使用PHP的GD库实现图片水印功能,包括图形叠加和文字水印两种常见场景,提供可直接运行的代码及关键参数解析。

结果与目标

在网页开发中,为图片添加水印是保护版权的常用手段。本文将展示如何利用PHP内置的图像处理扩展(GD库)完成两项操作:

  • 图形水印:将一个透明的Logo图片或标志叠加到原始图片上。
  • 文字水印:在图片特定位置写入自定义文字内容。

准备条件

  1. 环境支持:服务器需开启PHP GD库扩展。可通过 phpinfo() 查看是否有 gd 模块。
  2. 字体文件:若需添加中文或其他复杂字体的文字水印,需准备对应的 .ttf 或 .otf 字体文件路径。
  3. 素材准备:准备好要处理的背景图片(JPG/PNG)以及作为水印的图片(建议透明背景的PNG)。

真实操作顺序

第1步:添加图形水印(Logo叠加)

目的:将水印图片按指定坐标和尺寸覆盖到背景图上。
关键逻辑:先下载/读取图片,创建图像资源,使用坐标映射复制图层,最后输出或保存。

以下是实现步骤的代码演示:

<?php
// 1. 设置图片路径(实际项目中建议使用本地文件路径而非远程URL,避免依赖file_get_contents打开HTTP Wrapper)
$bgPath = 'background.jpg'; // 背景大图
$watermarkPath = 'logo.png'; // 水印图片(建议PNG格式带透明度)

// 2. 创建图像资源
$backgroundImg = imagecreatefromstring(file_get_contents($bgPath));
$watermarkImg = imagecreatefromstring(file_get_contents($watermarkPath));

if ($backgroundImg === false || $watermarkImg === false) {
    die('无法加载图片资源');
}

// 3. 获取水印尺寸
$wmWidth = imagesx($watermarkImg);
$wmHeight = imagesy($watermarkImg);

// 4. 定义水印位置(例如:距离右上角10像素)
$xPos = imagesx($backgroundImg) - $wmWidth - 10;
$yPos = imagesy($backgroundImg) - $wmHeight - 10;

// 5. 执行图像拷贝混合
// imagecopy($dst_im, $src_im, $dst_x, $dst_y, $src_x, $src_y, $src_w, $src_h)
imagecopy($backgroundImg, $watermarkImg, $xPos, $yPos, 0, 0, $wmWidth, $wmHeight);

// 6. 输出图片
header("Content-Type: image/jpeg");
imagejpeg($backgroundImg, null, 90); // 质量90%
imagedestroy($backgroundImg);
imagedestroy($watermarkImg);
?>

注意:imagecopy 会完全覆盖下方的像素。如果需要半透明效果,应使用 imagecopymerge 替代,其增加了一个 $percent 参数来控制透明度(0-100)。

第2步:添加文字水印(FTText)

目的:在图片上渲染TTF字体文字。
关键逻辑:分配颜色,计算坐标,调用 imagefttext 绘制,根据原图格式输出对应 MIME 类型。

<?php
// 1. 加载背景图
$imgPath = 'photo.jpg';
$image = imagecreatefromstring(file_get_contents($imgPath));

// 2. 设置文字属性
$fontFile = './arial.ttf'; // 确保字体文件存在且路径正确
$text = '© My Website';
$fontSize = 20;
$angle = 0;
$color = imagecolorallocate($image, 255, 255, 255); // 白色文字
// 阴影颜色(可选)
$shadowColor = imagecolorallocate($image, 0, 0, 0); 

// 3. 设置坐标 (X, Y)。Y通常基于基线,可能需要微调以视觉居中
$x = 10;
$y = 50;

// 4. 绘制文字
// 如需更精确的位置控制,可使用 imagettfbbox() 预先计算文本边界框
imagefttext($image, $fontSize, $angle, $x, $y, $shadowColor, $fontFile, $text);
imagefttext($image, $fontSize, $angle, $x+1, $y-1, $color, $fontFile, $text);

// 5. 判断原图类型并输出
list($width, $height, $type) = getimagesize($imgPath);
switch ($type) {
    case IMAGETYPE_JPEG:
        header('Content-Type: image/jpeg');
        imagejpeg($image, null, 90);
        break;
    case IMAGETYPE_PNG:
        header('Content-Type: image/png');
        imagepng($image);
        break;
    case IMAGETYPE_GIF:
        header('Content-Type: image/gif');
        imagegif($image);
        break;
    default:
        // 默认处理
        imagedestroy($image);
        exit('不支持的图片类型');
}

// 6. 销毁资源
imagedestroy($image);
?>

完成判断

当浏览器访问上述脚本时,如果能看到包含叠加Logo或文字的修改后图片,且右键保存得到的文件已包含水印,则操作成功。

简要总结

PHP处理图片水印主要依赖GD库的两个核心函数:imagecopy(或 imagecopymerge)用于图片合成,imagefttext 用于矢量字体文字渲染。使用时需注意内存管理(及时 imagedestroy)和编码兼容性问题(尤其是中文环境下需确保字体文件支持GBK或UTF-8字符集)。

以上就是PHP图片加水印的详细内容,更多关于PHP图像处理的相关资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。