PHP GD 库实现图片缩放与加水印方法详解
本文介绍了如何利用 PHP 的 GD 扩展库实现图片的高质量缩放(使用 imagecopyresampled)以及为图片添加半透明或全 opacity 水印的功能。文章提供了基础 API 的参数说明,并结合具体代码示例展示了从读取源图、创建新画布、执行缩放合并到最终输出保存的完整流程。
使用 imagecopyresampled 进行高质量图片缩放
在 PHP 中改变图像大小时,主要涉及两个核心函数:一个是较旧且算法粗糙的 ImageCopyResized(),另一个是推荐使用的 ImageCopyResampled()。后者采用了像素插值算法,生成的图像边缘更加平滑,虽然计算速度略慢于前者,但在绝大多数业务场景下,画质提升带来的收益远大于性能损耗。
第1步:理解核心函数的参数结构
imagecopyresampled() 用于将原图中指定区域的像素复制到目标图像的指定位置,并根据设定调整大小。其标准签名如下:
imagecopyresampled(
$dst_image, // 目标图像资源
$src_image, // 源图像资源
$dst_x, // 目标 X 坐标
$dst_y, // 目标 Y 坐标
$src_x, // 源 X 坐标
$src_y, // 源 Y 坐标
$dst_w, // 目标宽度
$dst_h, // 目标高度
$src_w, // 源宽度
$src_h // 源高度
);
该操作相当于在 Photoshop 中选择原图的一块区域($src_x, $src_y, $src_w, $src_h),将其“剪切”并粘贴到目标图的指定位置($dst_x, $dst_y),同时按照设定的 $dst_w 和 $dst_h 进行拉伸或压缩。
第2步:按比例缩放的完整代码实现
下面是一个通用的缩放脚本,它将指定的图片按百分比缩小并直接输出到浏览器。在实际项目中,您可以根据需求将 imagejpeg($thumb); 替换为 imagejpeg($thumb, 'new_filename.jpg'); 以保存到服务器硬盘。
<?php
// 1. 定义文件路径和缩放比例
$filename = 'test.jpg';
$percent = 0.5; // 缩放至原尺寸的 50%
// 2. 设置输出头信息,告知浏览器这是图片
header('Content-type: image/jpeg');
// 3. 获取源图像的原始宽高
list($width, $height) = getimagesize($filename);
// 4. 计算新的宽度和高度
$new_width = $width * $percent;
$new_height = $height * $percent;
// 5. 创建一个真彩色画布,用于存放缩放后的结果
$thumb = imagecreatetruecolor($new_width, $new_height);
// 6. 从文件加载源图像资源
$source = imagecreatefromjpeg($filename);
// 7. 执行高质量缩放复制
// 将 source 的全图 (0,0,width,height) 复制到 thumb 的 (0,0,new_width,new_height)
imagecopyresampled($thumb, $source, 0, 0, 0, 0, $new_width, $new_height, $width, $height);
// 8. 输出图像
imagejpeg($thumb);
// 清理内存资源
imagedestroy($source);
imagedestroy($thumb);
?>
使用 imagecopymerge 为图片添加水印
除了缩放,GD 库还常用于给图片打上版权水印。通过 imagecopymerge() 函数,我们可以将一张水印图(如 Logo)合并到原图上,并通过最后一个参数控制透明度。
第3步:实现图片水印叠加
以下代码演示如何将一个名为 logo.jpg 的水印,放置到原图的右下角附近。注意需要根据实际图片尺寸调整定位坐标。
<?php
// 1. 加载原图和水印图
$original = imagecreatefromjpeg('E:/image/guide_pic.jpg');
$watermark = imagecreatefromjpeg('E:/image/logo.jpg');
// 2. 获取原图的尺寸
list($orig_width, $orig_height, $orig_type) = getimagesize('E:/image/guide_pic.jpg');
// 获取水印图尺寸(可选,但通常用于自适应定位)
list($wm_width, $wm_height) = getimagesize('E:/image/logo.jpg');
// 3. 定义水印在原图中的起始位置
// 示例:距离底部 150px,距离右侧 124px,可根据实际水印尺寸动态计算
$pos_x = $orig_width - 124;
$pos_y = $orig_height - 150;
// 4. 合并图片
// 参数顺序:目标,源,目标X,目标Y,源X,源Y,目标W,目标H,源W,源H,透明度(0-100)
imagecopymerge($original, $watermark, $pos_x, $pos_y, 0, 0, $wm_width, $wm_height, 70);
// 5. 保存或输出带水印的图片
imagejpeg($original, 'E:/image/logo_watermarked.jpg', 90);
// 释放资源
imagedestroy($original);
imagedestroy($watermark);
?>
使用第三方类库简化处理
如果项目需要更复杂的图像处理逻辑(如强制裁剪、保持宽高比自动缩放等),引入轻量级的图像处理类库(如 SimpleImage)可以降低维护成本。该类库封装了上述底层函数,提供更简洁的 API。
- 设定固定宽高:
$image->resize(250, 400); - 仅限制宽度,高度等比缩放:
$image->resizeToWidth(250); - 按比例缩放(如 50%):
$image->scale(50);
开发者只需实例化对象,调用 load() 载入图片,执行相应的处理方法,最后使用 save() 保存或 output() 直接在屏幕上显示即可。
以上就是 PHP GD 库实现图片缩放与添加水印的详细内容,更多关于 PHP 图像处理技巧的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













