在PHP开发中,为图片添加水印文字和生成缩略图是常见的需求,广泛应用于图片展示、版权保护等场景,本文将详细介绍如何使用PHP实现这两个功能,并提供具体的代码示例。

准备工作
在开始之前,确保你的PHP环境已安装GD库,GD库是PHP处理图像的扩展,默认情况下许多PHP环境已经包含,你可以通过phpinfo()函数检查是否已启用GD库,如果未启用,可以在php.ini文件中取消注释extension=gd2并重启PHP服务。
添加水印文字
水印文字通常用于标识图片的版权或来源,实现这一功能需要以下步骤:加载原始图片、设置字体样式和颜色、在指定位置绘制文字、保存处理后的图片。
使用imagecreatefromjpeg()、imagecreatefrompng()或imagecreatefromgif()函数根据图片类型加载原始图片,加载JPEG图片:
$originalImage = imagecreatefromjpeg('original.jpg');
定义水印文字的属性,如字体文件路径、字号、颜色和位置,字体文件可以是TrueType字体(.ttf)或GD内置字体,使用imagettftext()函数可以更灵活地控制文字样式:
$fontPath = 'arial.ttf'; $fontSize = 20; $textColor = imagecolorallocate($originalImage, 255, 255, 255); // 白色 $text = 'Copyright © 2025'; $positionX = 20; $positionY = 30;
调用imagettftext()函数绘制文字:
imagettftext($originalImage, $fontSize, 0, $positionX, $positionY, $textColor, $fontPath, $text);
使用imagejpeg()、imagepng()或imagegif()函数保存处理后的图片,并释放内存:

imagejpeg($originalImage, 'watermarked.jpg', 90); imagedestroy($originalImage);
生成缩略图
缩略图用于快速预览大图,通常需要保持原始图片的宽高比,生成缩略图的关键步骤包括:获取原始图片尺寸、计算缩略图尺寸、创建新画布、调整图片大小、保存缩略图。
获取原始图片的尺寸:
list($originalWidth, $originalHeight) = getimagesize('original.jpg');
$thumbnailWidth = 200;
$thumbnailHeight = 200;
计算缩略图的宽高比,确保图片不变形,可以使用以下公式:
$ratio = min($thumbnailWidth / $originalWidth, $thumbnailHeight / $originalHeight); $newWidth = $originalWidth * $ratio; $newHeight = $originalHeight * $ratio;
创建一个新的空白画布:
$thumbnail = imagecreatetruecolor($newWidth, $newHeight);
使用imagecopyresampled()函数调整图片大小并保持清晰度:
imagecopyresampled($thumbnail, $originalImage, 0, 0, 0, 0, $newWidth, $newHeight, $originalWidth, $originalHeight);
保存缩略图并释放内存:

imagejpeg($thumbnail, 'thumbnail.jpg', 90); imagedestroy($thumbnail); imagedestroy($originalImage);
综合应用:水印+缩略图
在实际应用中,可能需要同时为缩略图添加水印,可以将上述两个功能结合,先生成缩略图,再为缩略图添加水印文字。
// 生成缩略图
$originalImage = imagecreatefromjpeg('original.jpg');
list($originalWidth, $originalHeight) = getimagesize('original.jpg');
$thumbnailWidth = 200;
$thumbnailHeight = 200;
$ratio = min($thumbnailWidth / $originalWidth, $thumbnailHeight / $originalHeight);
$newWidth = $originalWidth * $ratio;
$newHeight = $originalHeight * $ratio;
$thumbnail = imagecreatetruecolor($newWidth, $newHeight);
imagecopyresampled($thumbnail, $originalImage, 0, 0, 0, 0, $newWidth, $newHeight, $originalWidth, $originalHeight);
// 添加水印文字
$fontPath = 'arial.ttf';
$fontSize = 12;
$textColor = imagecolorallocate($thumbnail, 255, 255, 255);
$text = 'Thumbnail';
$positionX = 10;
$positionY = $newHeight 20;
imagettftext($thumbnail, $fontSize, 0, $positionX, $positionY, $textColor, $fontPath, $text);
// 保存结果
imagejpeg($thumbnail, 'watermarked_thumbnail.jpg', 90);
imagedestroy($thumbnail);
imagedestroy($originalImage);
注意事项
- 字体文件路径:确保字体文件路径正确,否则imagettftext()函数会失败。
- 图片格式支持:不同函数支持的图片格式不同,如imagejpeg()不支持透明背景,而imagepng()支持。
- 内存管理:处理大图片时,注意释放内存,避免内存泄漏。
- 性能优化:对于批量处理,可以考虑使用缓存或异步任务。
相关问答FAQs
Q1: 如何为PNG图片添加透明水印文字?
A1: 对于PNG图片,可以使用imagecolorallocatealpha()函数设置带透明度的颜色,并在保存时使用imagepng()函数。
$textColor = imagecolorallocatealpha($originalImage, 255, 255, 255, 50); // 50%透明度 imagettftext($originalImage, $fontSize, 0, $positionX, $positionY, $textColor, $fontPath, $text); imagepng($originalImage, 'watermarked.png');
Q2: 缩略图生成时如何固定宽度或高度?
A2: 如果希望固定宽度或高度,可以只计算其中一个维度,另一个维度按比例调整,固定宽度为200px,高度按比例计算:
$thumbnailWidth = 200; $ratio = $thumbnailWidth / $originalWidth; $newHeight = $originalHeight * $ratio;
标签: php添加图片水 印php生成缩略 图php图片处理