请讲解下面的GD库函数:图像输出
imagepng() - 输出PNG图像
imagejpeg() - 输出JPEG图像(可设质量)
imagegif() - 输出GIF图像
imagewbmp() - 输出WBMP图像
imagegd() - 输出GD格式图像
imagegd2() - 输出GD2格式图像
imagewebp() - 输出WebP图像
以下是GD库图像输出函数的详细讲解,包含语法结构、参数说明、示例代码及专业解析:
一、imagepng() - 输出PNG图像
语法结构
bool imagepng( resource $image, [mixed $to = null], [int $quality = -1], [int $filters = -1] )
参数说明
示例代码
<?php
// 创建透明画布
$img = imagecreatetruecolor(300, 200);
$transparent = imagecolorallocatealpha($img, 0, 0, 0, 127);
imagefill($img, 0, 0, $transparent);
// 绘制半透明圆形
$red = imagecolorallocatealpha($img, 255, 0, 0, 63);
imagefilledellipse($img, 150, 100, 180, 180, $red);
// 输出PNG(启用alpha通道)
imagesavealpha($img, true);
imagepng($img, 'output.png', 6, PNG_FILTER_NONE);
// 直接输出到浏览器
header('Content-Type: image/png');
imagepng($img, null, 9); // 最高质量
imagedestroy($img);
?>代码解析:
创建300x200透明画布(
imagecolorallocatealpha设置透明度)绘制半透明红色圆形(alpha=63)
保存为PNG文件(质量级别6,禁用过滤器)
另输出到浏览器(质量级别9)
必须调用
imagesavealpha保持透明度
二、imagejpeg() - 输出JPEG图像
语法结构
bool imagejpeg( resource $image, [mixed $to = null], [int $quality = -1] )
参数说明
示例代码
<?php
$img = imagecreatefrompng('source.png');
// 转换为JPEG背景
$bg = imagecreatetruecolor(imagesx($img), imagesy($img));
$white = imagecolorallocate($bg, 255, 255, 255);
imagefill($bg, 0, 0, $white);
imagecopy($bg, $img, 0, 0, 0, 0, imagesx($img), imagesy($img));
// 输出不同质量版本
imagejpeg($bg, 'high_quality.jpg', 90); // 高质量
imagejpeg($bg, 'low_quality.jpg', 30); // 低质量
imagedestroy($img);
?>注意事项:
JPEG不支持透明度,需手动填充背景
质量<60可能产生明显压缩伪影
默认输出Progressive JPEG(渐进式加载)
三、imagegif() - 输出GIF图像
语法结构
bool imagegif( resource $image, [mixed $to = null] )
示例代码
<?php
// 创建动画GIF(多帧)
$frames = [];
for ($i = 0; $i < 5; $i++) {
$frame = imagecreatetruecolor(100, 100);
$color = imagecolorallocate($frame, rand(0,255), rand(0,255), rand(0,255));
imagefill($frame, 0, 0, $color);
$frames[] = $frame;
}
// 合并为GIF动画
$gif = new Imagick();
foreach ($frames as $frame) {
$gif->addImage(new Imagick(imagegif($frame)));
imagedestroy($frame);
}
$gif->writeImages('animation.gif', true);
?>关键特性:
单帧GIF直接输出
多帧动画需配合Imagick扩展
仅支持256色索引颜色
四、imagewbmp() - 输出WBMP图像
语法结构
bool imagewbmp( resource $image, [mixed $to = null], [int $foreground = null] )
参数说明
示例代码
<?php
$img = imagecreate(200, 200);
$white = imagecolorallocate($img, 255, 255, 255);
$black = imagecolorallocate($img, 0, 0, 0);
imagefilledrectangle($img, 50, 50, 150, 150, $black);
// 输出WBMP(黑白位图)
header('Content-Type: image/vnd.wap.wbmp');
imagewbmp($img, null, $black); // 显式指定前景色
imagedestroy($img);
?>应用场景:
移动设备兼容图像
超低带宽传输
单色显示设备
五、imagegd() - 输出GD格式图像
语法结构
bool imagegd( resource $image, [mixed $to = null] )
示例代码
<?php
$img = imagecreatefromjpeg('photo.jpg');
imagegd($img, 'output.gd'); // 保存为GD格式
$gd_data = file_get_contents('output.gd');
$reloaded = imagecreatefromstring($gd_data); // 重新加载
?>格式特点:
无损原始数据
仅限PHP环境使用
文件体积大于PNG
六、imagegd2() - 输出GD2格式图像
语法结构
bool imagegd2( resource $image, [mixed $to = null], [int $chunk_size = 128], [int $type = IMG_GD2_RAW] )
参数说明
示例代码
<?php $img = imagecreatetruecolor(400, 300); imagegd2($img, 'compressed.gd2', 64, IMG_GD2_COMPRESSED); // 分块压缩 ?>
优化建议:
大图像使用分块(如512px)
网络传输用
IMG_GD2_COMPRESSED
七、imagewebp() - 输出WebP图像
语法结构
bool imagewebp( resource $image, [mixed $to = null], [int $quality = 80] )
示例代码
<?php
$img = imagecreatefrompng('transparent.png');
// 转换透明WebP
imagesavealpha($img, true);
imagewebp($img, 'output.webp', 85);
// 检测浏览器支持
if (strpos($_SERVER['HTTP_ACCEPT'], 'image/webp') !== false) {
header('Content-Type: image/webp');
imagewebp($img);
}
?>现代Web优化:
平均比JPEG小25-35%
支持有损/无损压缩
透明度支持需PHP 7.0+
图像输出函数综合比较表
关键特性补充说明
压缩效率对比:
WebP > JPEG ≈ PNG > GIF > GD/GD2 > WBMP
WebP相比PNG平均节省26%体积,相比JPEG节省25-34%
透明度实现差异:
PNG/WebP:支持半透明(Alpha混合)
GIF:仅支持完全透明/不透明
其他格式:不支持透明度
特殊功能支持:
渐进式加载:JPEG/PNG/WebP支持
分块处理:仅GD2格式原生支持
元数据保留:PNG/JPEG/WebP支持EXIF等元数据
PHP版本要求:
WebP支持需PHP 5.4+
动画WebP需PHP 7.1+
GD2分块处理需PHP 4.3+
内存消耗参考:
plaintextCopy Code真彩色图像 > 索引色图像 PNG处理 > JPEG处理 > GIF处理 分块GD2处理可降低大图内存占用
建议根据具体需求选择格式:需要透明选PNG/WebP,照片选JPEG/WebP,动画选GIF/WebP,内部处理选GD/GD2。