php图片处理核心用gd库,水印需启用alpha合成并用imagettftext或imagecopymerge实现,缩略图通过等比缩放+居中裁剪完成,注意格式兼容、exif朝向及资源释放。

PHP 实现图片水印和缩略图裁剪,核心是 GD 库(或 Imagick),日常项目中用 GD 就够用,无需额外扩展。关键在于理解图像加载、坐标计算、透明度控制和输出逻辑。
水印:文字或图片叠加,注意透明与位置
文字水印适合版权标识,图片水印更灵活(如 logo)。GD 默认不支持 PNG 透明通道叠加,需手动启用 alpha 合成。
- 加载原图后,用 imagealphablending($dst, true) 和 imagesavealpha($dst, true) 保留透明背景
- 文字水印用 imagettftext(),指定字体文件路径、字号、角度、起始坐标;建议把文字画在临时图层再合并,方便居中或旋转
- 图片水印用 imagecopy() 或 imagecopymerge()(后者支持透明度参数,比如 70 表示 30% 透明)
- 水印位置建议按比例计算,例如右下角留 10px 边距:imagesx($dst) - imagesx($water) - 10
缩略图:等比缩放 + 居中裁剪,避免变形
单纯等比缩放会留白,常见需求是“固定尺寸强制裁剪”,比如生成 200×200 的正方形头像图。
- 先获取原图宽高,计算缩放比例:scale = max($targetW / $srcW, $targetH / $srcH)
- 按比例缩放后得到中间图尺寸,再计算裁剪区域左上角坐标:$x = ($newW - $targetW) / 2,$y = ($newH - $targetH) / 2
- 用 imagecopyresampled() 一次性完成缩放+裁剪:源图按比例缩放到中间尺寸,再从中间截取目标区域
- 注意 JPEG 默认不保留 EXIF 朝向,手机拍的照片可能倒置,可先用 exif_read_data() 判断并旋转
格式兼容与输出控制
输入可能是 JPG、PNG、WEBP,输出也应保持原格式或按需转换。GD 对 WebP 支持从 PHP 7.4 开始完善,旧版本需降级处理。
- 用 getimagesize() 获取类型,配合 imagecreatefromxxx() 动态加载(如 png → imagecreatefrompng)
- 输出时设置对应 header:header('Content-Type: image/jpeg'),再用 imagejpeg() 输出到浏览器或保存文件
- 质量参数很重要:JPEG 推荐 85–95,PNG 无质量参数但可用 imagepng($img, null, 9) 控制压缩等级(0–9)
- 记得销毁资源:imagedestroy($img) 防止内存泄漏,尤其批量处理时
实用建议:封装成函数,避免重复造轮子
把水印和缩略图逻辑拆成独立函数,传入路径、目标尺寸、水印配置等参数,返回处理后的图像资源或保存路径。
- 水印函数支持开关、位置(tl/tr/ct/cr/bl/br/cc)、透明度、字体大小等参数
- 缩略图函数区分“缩放不裁剪”、“缩放+填充”、“缩放+裁剪”三种模式
- 加简单错误判断:文件是否存在、是否为合法图片、GD 是否启用
- 生产环境建议加缓存机制,相同参数的处理结果可复用,避免重复运算
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











