PHP GD 库实现图片缩放与加水印方法详解

清欢
清欢
发布时间:2026-10-14| 6人浏览过
原创

本文介绍了如何利用 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 图像处理技巧的资料请关注本站其它相关文章!

相关标签:

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

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 算法库。