请讲解下面的GD库函数:图像处理
imagecopy() - 复制图像部分区域
imagecopyresized() - 复制并调整大小(低质量)
imagecopyresampled() - 复制并调整大小(高质量)
imagescale() - 缩放图像
imagecrop() - 裁剪图像
imagecropauto() - 自动裁剪(如透明区域)
imagerotate() - 旋转图像
imageflip() - 翻转图像(水平/垂直)
imagefilter() - 应用滤镜(如模糊、灰度等)
imagesavealpha() - 保存PNG图像的Alpha通道
我将按照您要求的格式继续讲解GD库中的图像处理函数,保持与之前相同的详细程度和结构完整性。
一、imagecopy() - 复制图像部分区域
语法结构
bool imagecopy( resource $dst_im, resource $src_im, int $dst_x, int $dst_y, int $src_x, int $src_y, int $src_w, int $src_h )
参数说明
示例代码及解析
<?php
// 创建目标图像(400x400)
$dst = imagecreatetruecolor(400, 400);
$white = imagecolorallocate($dst, 255, 255, 255);
imagefill($dst, 0, 0, $white);
// 加载源图像
$src = imagecreatefromjpeg('example.jpg'); // 假设是600x400的图像
// 复制中央区域(300x300)到目标图像中央
$src_w = 300;
$src_h = 300;
$src_x = (imagesx($src) - $src_w) / 2; // 水平居中
$src_y = (imagesy($src) - $src_h) / 2; // 垂直居中
imagecopy(
$dst, $src,
50, 50, // 目标位置(50,50)
$src_x, $src_y, // 源图起始点
$src_w, $src_h // 复制区域大小
);
// 输出
header('Content-Type: image/png');
imagepng($dst);
imagedestroy($dst);
imagedestroy($src);
?>代码解析:
创建400x400白色背景目标图像
从JPEG文件加载源图像
计算源图像中央300x300区域坐标
将该区域复制到目标图像的(50,50)位置
输出PNG格式结果
销毁两个图像资源
注意事项
不执行缩放操作
适合精确区域复制
目标位置可以超出目标图像范围(会被裁剪)
二、imagecopyresized() - 复制并调整大小(低质量)
语法结构
bool imagecopyresized( resource $dst_im, resource $src_im, int $dst_x, int $dst_y, int $src_x, int $src_y, int $dst_w, int $dst_h, int $src_w, int $src_h )
参数说明(新增)
示例代码及解析
<?php
// 创建目标图像(300x300)
$dst = imagecreatetruecolor(300, 300);
// 加载源图像(假设是600x400)
$src = imagecreatefrompng('source.png');
// 将整个源图像缩放到200x200放入目标图像
imagecopyresized(
$dst, $src,
50, 50, // 目标位置
0, 0, // 源图起点
200, 200, // 目标尺寸
imagesx($src), imagesy($src) // 源图完整尺寸
);
// 添加缩略图边框
$black = imagecolorallocate($dst, 0, 0, 0);
imagerectangle($dst, 49, 49, 251, 251, $black);
// 输出
header('Content-Type: image/jpeg');
imagejpeg($dst);
imagedestroy($dst);
imagedestroy($src);
?>代码解析:
创建300x300目标图像
从PNG加载源图像
将完整源图像缩放到200x200
放置在目标图像的(50,50)位置
添加2像素黑色边框
输出JPEG图像
注意事项
使用快速但低质量的算法
会产生锯齿和失真
适合不需要高质量的场景
三、imagecopyresampled() - 复制并调整大小(高质量)
语法结构
bool imagecopyresampled( resource $dst_image, resource $src_image, int $dst_x, int $dst_y, int $src_x, int $src_y, int $dst_w, int $dst_h, int $src_w, int $src_h )
参数说明
$dst_image:目标图像资源标识符$src_image:源图像资源标识符$dst_x/$dst_y:目标图像中的起始坐标(左上角)$src_x/$src_y:源图像中的起始坐标(左上角)$dst_w/$dst_h:目标区域的宽度和高度$src_w/$src_h:源图像中要复制的区域的宽度和高度
该函数会返回布尔值,成功时返回TRUE,失败时返回FALSE。
函数功能是将源图像的一部分复制到目标图像,并进行重新采样处理,特别适合用于生成缩略图等需要改变图像尺寸的场景。
示例代码及解析
<?php
// 创建高精度目标图像(800x600)
$dst = imagecreatetruecolor(800, 600);
// 加载小尺寸源图(200x150)
$src = imagecreatefromjpeg('small.jpg');
// 高质量放大4倍
imagecopyresampled(
$dst, $src,
0, 0, // 目标起点
0, 0, // 源图起点
800, 600, // 目标尺寸
imagesx($src), imagesy($src) // 源图尺寸
);
// 保存高质量JPEG
imagejpeg($dst, 'enlarged.jpg', 95);
imagedestroy($dst);
imagedestroy($src);
echo "高质量放大图像已保存为enlarged.jpg";
?>代码解析:
创建800x600目标图像
加载小尺寸JPEG源图
使用resampled方法高质量放大
保存为95质量的JPEG文件
输出完成消息
与resized的区别
四、imagescale() - 缩放图像
语法结构
resource|false imagescale( resource $image, int $new_width, int $new_height = -1, int $mode = IMG_BILINEAR_FIXED )
参数说明
缩放模式常量
IMG_NEAREST_NEIGHBOUR: 最近邻插值IMG_BILINEAR_FIXED: 双线性插值IMG_BICUBIC: 双三次插值IMG_BICUBIC_FIXED: 快速双三次近似
示例代码及解析
<?php
// 加载原始图像
$src = imagecreatefrompng('original.png');
// 等比例缩放到宽度300
$scaled1 = imagescale($src, 300);
// 强制缩放到200x200
$scaled2 = imagescale($src, 200, 200);
// 高质量缩放到宽度500
$scaled3 = imagescale($src, 500, -1, IMG_BICUBIC);
// 保存结果
imagepng($scaled1, 'scaled_width.png');
imagepng($scaled2, 'scaled_square.jpg');
imagepng($scaled3, 'scaled_highquality.png');
// 释放资源
imagedestroy($src);
imagedestroy($scaled1);
imagedestroy($scaled2);
imagedestroy($scaled3);
?>代码解析:
加载原始PNG图像
三种不同缩放方式:
等比例宽度300
强制200x200方形
高质量宽度500
分别保存结果
清理所有资源
注意事项
返回新图像资源,不修改原图
默认保持宽高比
PHP 5.5+版本支持
五、imagecrop() - 裁剪图像
语法结构
resource|false imagecrop( resource $image, array $rect )
参数说明
裁剪区域数组
[ 'x' => int, // 起点x 'y' => int, // 起点y 'width' => int, // 宽度 'height' => int // 高度 ]
示例代码及解析
<?php
// 加载全景图
$image = imagecreatefromjpeg('panorama.jpg');
// 定义中央区域(16:9比例)
$width = imagesx($image);
$height = imagesy($image);
$crop_height = $width * 9 / 16;
$rect = [
'x' => 0,
'y' => ($height - $crop_height) / 2,
'width' => $width,
'height' => $crop_height
];
// 执行裁剪
$cropped = imagecrop($image, $rect);
// 保存结果
imagejpeg($cropped, 'cropped_16_9.jpg', 90);
// 释放资源
imagedestroy($image);
imagedestroy($cropped);
?>代码解析:
加载全景图JPEG
计算16:9比例的裁剪高度
设置从水平中央裁剪的区域
执行裁剪操作
保存90质量JPEG
清理资源
注意事项
返回新图像资源
裁剪区域不能超出原图范围
PHP 5.5+版本支持
六、imagecropauto() - 自动裁剪
语法结构
resource|false imagecropauto( resource $image, int $mode = IMG_CROP_DEFAULT, float $threshold = 0.5, int $color = -1 )
裁剪模式常量
示例代码及解析
<?php // 创建带透明背景的图像 $image = imagecreatetruecolor(500, 300); $transparent = imagecolorallocatealpha($image, 0, 0, 0, 127); $red = imagecolorallocate($image, 255, 0, 0); imagefill($image, 0, 0, $transparent); // 绘制非居中红色圆形 imagefilledellipse($image, 100, 100, 150, 150, $red); // 自动裁剪透明区域 $cropped = imagecropauto($image, IMG_CROP_TRANSPARENT); // 保存结果 imagesavealpha($cropped, true); imagepng($cropped, 'auto_cropped.png'); // 释放资源 imagedestroy($image); imagedestroy($cropped); ?>
代码解析:
创建500x300透明背景图像
在左上角绘制红色圆形
自动裁剪掉透明区域
保存PNG保留alpha通道
清理资源
注意事项
对非透明图像使用
IMG_CROP_BLACK/WHITE阈值参数仅对
IMG_CROP_THRESHOLD有效可能需要多次尝试不同模式
七、imagerotate() - 旋转图像
语法结构
resource|false imagerotate( resource $image, float $angle, int $bgd_color, int $ignore_transparent = 0 )
参数说明
示例代码及解析
<?php
// 加载图像
$src = imagecreatefrompng('arrow.png');
// 旋转45度(红色背景)
$rotated = imagerotate($src, 45, imagecolorallocate($src, 255, 0, 0));
// 旋转30度(透明背景保持)
imagesavealpha($src, true);
$transparent = imagecolorallocatealpha($src, 0, 0, 0, 127);
$rotated_trans = imagerotate($src, 30, $transparent);
// 保存结果
imagepng($rotated, 'rotated_red.png');
imagepng($rotated_trans, 'rotated_trans.png');
// 释放资源
imagedestroy($src);
imagedestroy($rotated);
imagedestroy($rotated_trans);
?>代码解析:
加载PNG源图
旋转45度用红色填充背景
旋转30度保持透明背景
分别保存两种结果
清理所有资源
注意事项
角度为正数逆时针旋转
图像尺寸会改变以适应旋转
透明背景需要先设置
imagesavealpha
八、imageflip() - 翻转图像
语法结构
bool imageflip( resource $image, int $mode )
翻转模式常量
示例代码及解析
<?php
// 加载不对称图像
$image = imagecreatefromjpeg('asymmetrical.jpg');
// 创建三个副本
$hflip = imagecreatetruecolor(imagesx($image), imagesy($image));
$vflip = imagecreatetruecolor(imagesx($image), imagesy($image));
$bothflip = imagecreatetruecolor(imagesx($image), imagesy($image));
imagecopy($hflip, $image, 0, 0, 0, 0, imagesx($image), imagesy($image));
imagecopy($vflip, $image, 0, 0, 0, 0, imagesx($image), imagesy($image));
imagecopy($bothflip, $image, 0, 0, 0, 0, imagesx($image), imagesy($image));
// 执行不同翻转
imageflip($hflip, IMG_FLIP_HORIZONTAL);
imageflip($vflip, IMG_FLIP_VERTICAL);
imageflip($bothflip, IMG_FLIP_BOTH);
// 保存结果
imagejpeg($hflip, 'horizontal_flip.jpg');
imagejpeg($vflip, 'vertical_flip.jpg');
imagejpeg($bothflip, 'both_flip.jpg');
// 释放资源
imagedestroy($image);
imagedestroy($hflip);
imagedestroy($vflip);
imagedestroy($bothflip);
?>代码解析:
加载原始图像
创建三个相同尺寸的副本
分别执行水平、垂直和双向翻转
保存所有结果
清理资源
注意事项
直接修改原图资源
比手动复制像素效率高
PHP 5.5+版本支持
九、imagefilter() - 应用滤镜
语法结构(完整参数)
bool imagefilter( resource $image, int $filtertype, [int $arg1], [int $arg2], [int $arg3], [int $arg4] )
完整滤镜参数表
完整示例代码
<?php
// 加载原始图像
$image = imagecreatefromjpeg('portrait.jpg');
// 创建滤镜演示网格(3x4)
$canvas = imagecreatetruecolor(imagesx($image)*3, imagesy($image)*4);
$white = imagecolorallocate($canvas, 255, 255, 255);
imagefill($canvas, 0, 0, $white);
// 定义所有滤镜及其参数
$filters = [
['name' => 'Original', 'type' => null],
['name' => 'Negate', 'type' => IMG_FILTER_NEGATE],
['name' => 'Grayscale', 'type' => IMG_FILTER_GRAYSCALE],
['name' => 'Brightness +50', 'type' => IMG_FILTER_BRIGHTNESS, 'args' => [50]],
['name' => 'Contrast -30', 'type' => IMG_FILTER_CONTRAST, 'args' => [-30]],
['name' => 'Colorize Blue', 'type' => IMG_FILTER_COLORIZE, 'args' => [0, 0, 255, 30]],
['name' => 'Edge Detect', 'type' => IMG_FILTER_EDGEDETECT],
['name' => 'Emboss', 'type' => IMG_FILTER_EMBOSS],
['name' => 'Gaussian Blur', 'type' => IMG_FILTER_GAUSSIAN_BLUR],
['name' => 'Mean Removal', 'type' => IMG_FILTER_MEAN_REMOVAL],
['name' => 'Pixelate', 'type' => IMG_FILTER_PIXELATE, 'args' => [10, 1]],
['name' => 'Smooth -5', 'type' => IMG_FILTER_SMOOTH, 'args' => [-5]]
];
// 应用滤镜并排列到网格
$cols = 3;
$index = 0;
foreach ($filters as $filter) {
$col = $index % $cols;
$row = floor($index / $cols);
$x = $col * imagesx($image);
$y = $row * imagesy($image);
// 复制原始图像
$copy = imagecreatetruecolor(imagesx($image), imagesy($image));
imagecopy($copy, $image, 0, 0, 0, 0, imagesx($image), imagesy($image));
// 应用滤镜
if ($filter['type'] !== null) {
$args = $filter['args'] ?? [];
imagefilter($copy, $filter['type'], ...$args);
}
// 添加到画布
imagecopy($canvas, $copy, $x, $y, 0, 0, imagesx($copy), imagesy($copy));
// 添加标签
$black = imagecolorallocate($canvas, 0, 0, 0);
imagestring($canvas, 3, $x+10, $y+10, $filter['name'], $black);
imagedestroy($copy);
$index++;
}
// 输出结果
header('Content-Type: image/jpeg');
imagejpeg($canvas, null, 90);
// 释放资源
imagedestroy($image);
imagedestroy($canvas);
?>代码解析:
加载原始人像照片
创建容纳12种滤镜效果的画布(3列×4行)
定义包含所有滤镜类型的数组
使用网格系统排列各种滤镜效果:
第1列为原始图像
第2-12列应用不同滤镜
每个滤镜单元包含:
图像副本
滤镜应用
文字标签
输出高质量JPEG(90质量)
清理所有图像资源
高级使用技巧
滤镜叠加:
// 先灰度化再浮雕 imagefilter($image, IMG_FILTER_GRAYSCALE); imagefilter($image, IMG_FILTER_EMBOSS);
动态参数调节:
// 根据图像尺寸自动计算像素大小 $pixelSize = max(5, min(20, imagesx($image)/50)); imagefilter($image, IMG_FILTER_PIXELATE, $pixelSize, true);
选择性应用:
// 只对图像右半部分应用滤镜 $width = imagesx($image); $cropped = imagecrop($image, ['x' => $width/2, 'y' => 0, 'width' => $width/2, 'height' => imagesy($image)]); imagefilter($cropped, IMG_FILTER_COLORIZE, 100, 50, 0); imagecopy($image, $cropped, $width/2, 0, 0, 0, $width/2, imagesy($image));
性能优化:
// 对缩略图应用滤镜更高效 $thumb = imagescale($image, 200); imagefilter($thumb, IMG_FILTER_GAUSSIAN_BLUR); $thumb = imagescale($thumb, imagesx($image), imagesy($image));
完整注意事项总结
兼容性:
部分滤镜需要GD库编译时支持
IMG_FILTER_PIXELATE需要PHP 5.3+资源消耗:
高斯模糊最耗资源
大图像建议先缩小处理
透明度处理:
多数滤镜会移除alpha通道
处理透明图像需先保存alpha
效果差异:
不同GD版本效果可能不同
建议实际测试验证
错误处理:
返回false表示失败
可用
imageistruecolor()检查兼容性
十、imagesavealpha() - 保存PNG图像的Alpha通道
语法结构
bool imagesavealpha( resource $image, bool $enable )
参数说明
示例代码及解析
<?php
// 创建透明画布
$image = imagecreatetruecolor(400, 300);
imagealphablending($image, false); // 关闭混合模式
// 分配透明色(完全透明)
$transparent = imagecolorallocatealpha($image, 0, 0, 0, 127);
imagefill($image, 0, 0, $transparent);
// 绘制半透明圆形
$red = imagecolorallocatealpha($image, 255, 0, 0, 63);
imagefilledellipse($image, 200, 150, 200, 200, $red);
// 启用alpha通道保存
imagesavealpha($image, true);
// 输出PNG
header('Content-Type: image/png');
imagepng($image);
// 对比测试(不保存alpha)
/*
imagesavealpha($image, false);
imagepng($image, 'no_alpha.png');
*/
imagedestroy($image);
?>代码解析:
创建400x300真彩色图像
关闭alpha混合以获得真实透明度
分配完全透明背景色(alpha=127)
绘制半透明红色圆形(alpha=63)
启用alpha通道保存
输出PNG图像
注释部分展示不保存alpha的效果对比
关键注意事项
执行顺序:
必须在
imagepng()之前调用建议在绘制完成后调用
相关函数:
imagealphablending($image, false); // 必须关闭混合 imagesavealpha($image, true); // 再启用保存
透明度级别:
0 = 不透明
127 = 完全透明
中间值 = 半透明
文件格式:
只对PNG格式有效
JPEG不支持透明度
常见问题:
忘记关闭alphablending会导致透明度异常
多次调用以不同设置保存时需要注意状态
GD库图像处理函数综合对比表
关键维度对比说明
质量与性能平衡
优先选
imagecopyresampled处理最终输出(高质量)1临时预览用
imagecopyresized(速度快)1自动化能力
imagecropauto可智能去背景(如证件照白边消除)3imagescale保持比例无需计算高度4特殊场景优化
缩略图生成:
imagescale+imagecrop组合5批量处理:禁用
imagesavealpha提升速度(非透明图)1透明通道处理黄金步骤:
imagealphablending($img, false); // 1.关闭混合模式 // ...绘制操作... imagesavealpha($img, true); // 2.启用通道保存 imagepng($img); // 3.输出PNG
注:实际选择需权衡质量需求(如印刷品选resampled)、实时性要求(如Web应用选resized)及功能特性(如透明处理必用imagesavealpha)。