什么是GD库?PHP中7大类64个GD库函数用法详解
GD库作为Web开发的重要组件,解决了服务器端动态生成图像的核心需求,在验证码生成、图片缩略图处理、水印添加等场景中发挥着不可替代的作用。在PHP应用中,GD库通过一系列图像处理函数实现画布创建、图形绘制、文字渲染和特效处理等功能,其轻量高效的特性使其成为PHP开发者处理图像任务的首选方案,极大增强了Web应用的图像交互能力。相较于其他图像处理方案,GD库的优势在于无需额外安装软件即可实现基础的图像处理需求。
一、什么是GD库?
PHP中的GD库是一个开源的图像处理扩展库,它提供了一系列用于创建和操作图像的函数接口。这个库最初由Thomas Boutell开发,后来被整合到PHP中成为核心扩展之一。GD库采用C语言编写,能够高效地处理各种图形操作任务,包括图像生成、格式转换、特效处理等,目前支持PNG、JPEG、GIF、WBMP等多种主流图像格式。在Web开发领域,GD库是实现动态图像处理的关键技术组件,几乎所有需要服务器端图像处理的PHP应用都会依赖这个库。
从技术架构来看,GD库本质上是一组面向过程的API函数集合,这些函数可以直接操作图像资源。当PHP脚本调用GD函数时,实际上是通过扩展模块调用底层C库的图形处理能力。这种设计使得GD库既保持了C语言的高性能,又能与PHP的脚本特性无缝结合。值得注意的是,不同PHP版本集成的GD库版本存在差异,例如PHP 5.4默认搭载GD 2.0,而PHP 7.0以上版本则支持更先进的GD 2.1特性。开发者可以通过gd_info()函数获取当前环境的GD库详细信息,包括支持的图像格式和功能特性。
GD库在现代Web开发中具有不可替代的重要性。首先,它使得PHP具备了动态生成图像的能力,这是实现验证码、统计图表等功能的底层支撑。例如电商网站的商品缩略图、社交媒体的头像裁剪、内容管理系统的水印添加等常见需求,都需要依赖GD库的图像处理功能。其次,GD库提供了像素级的图像控制接口,开发者可以精确操作每个像素点的颜色值,这为特殊效果处理(如滤镜、马赛克等)创造了条件。更重要的是,GD库作为PHP的标准扩展,其稳定性和兼容性经过长期验证,相比第三方图像处理方案具有更好的部署便利性。
在实际应用中,GD库的典型使用场景主要集中在三个领域。最基础的是图像生成,包括创建空白画布、绘制几何图形、添加文字等操作。例如生成动态验证码时,需要先创建图像资源,然后用随机函数绘制干扰线和验证码文本,最后输出到浏览器。其次是图像处理,这是GD库的核心价值所在,涵盖缩放、裁剪、旋转、合并等常见操作。比如制作缩略图时,通常会组合使用imagecopyresampled()和imagecrop()函数,在保持比例的同时确保关键内容可见。最后是格式转换,通过imagejpeg()、imagepng()等输出函数,可以实现不同图像格式之间的相互转换,这对优化网站资源加载速度很有帮助。
从技术实现角度看,使用GD库处理图像通常遵循标准流程。首先要创建或加载图像资源,这个步骤根据来源不同可选择imagecreatetruecolor()创建空白图像,或使用imagecreatefromjpeg()等函数加载现有文件。接着进行图像处理操作,此时需要注意资源管理问题,特别是处理大尺寸图像时要及时释放不再需要的资源。最后通过输出函数保存或直接发送图像到客户端,这个阶段需要根据实际需求设置质量参数,如JPEG的压缩质量、PNG的压缩级别等。在整个过程中,正确的颜色管理和透明度处理尤为关键,需要合理使用imagealphablending()和imagesavealpha()等函数控制混合模式。
GD库虽然功能强大,但在使用过程中也存在一些限制和注意事项。最显著的是内存消耗问题,处理高分辨率图像时可能占用大量内存,需要通过memory_limit配置适当调整。另外,不同版本对图像格式的支持存在差异,早期版本可能缺少WebP等现代格式的支持,需要开发者特别注意环境兼容性。性能方面,复杂的图像处理操作(如高斯模糊)可能产生较高CPU负载,在生产环境中需要考虑使用队列异步处理或缓存机制。值得注意的是,GD库某些函数在不同PHP版本中的行为可能发生变化,例如GIF支持就经历过移除又重新添加的过程,这要求开发者在跨版本部署时进行充分测试。
随着Web技术的发展,GD库也在持续演进。最新版本的GD库增加了对WebP格式的支持,这显著提升了网络图像传输的效率。同时,现代PHP框架通常会对GD库进行面向对象的封装,提供更符合当前编程范式的接口,如Laravel的Intervention Image扩展。尽管出现了Imagick等替代方案,GD库凭借其轻量级特性和广泛的部署基础,仍然是PHP图像处理的首选方案。对于开发者而言,深入理解GD库的工作原理和最佳实践,仍然是构建高效图像处理应用的基础。
二、如何理解GD库?
我们可以打两个比喻,从下面2个角度去理解GD库的应用。
(一)GD库:神奇的数字画板
我们可以把GD库比作一个神奇的「数字画板」🧑🎨。想象一下你在手机上用绘图软件创作——选择画布尺寸、拿起画笔涂色、添加文字特效,最后保存成图片。GD库就是服务器端的这个创作工具包,只是它完全通过代码指令来操作。
graph LR
A[空白画布] --> B[绘制图形]
B --> C[添加文字]
C --> D[特效处理]
D --> E[输出图片]
🌈 核心功能比喻
1、画布 = 图像资源
imagecreatetruecolor(800,600)
就像领到一张800x600像素的空白画纸,等待创作。
2、画笔 = 绘图函数
imagefilledrectangle()
是方形蜡笔🟦,imageellipse()
是圆规⚪,imageline()
则是直尺📏——这些都是你作图的工具。
3、调色盘 = 颜色管理
imagecolorallocate()
如同调色盘,混合RGB数值(255,0,0
=❤️鲜红)填充到图形中。
4、特效工具 = 图像处理
缩略图:像用缩小镜看画🔍
水印:如同盖章落款📌
旋转:好比旋转画架🔄
5、保存作品 = 输出格式
根据需求保存为不同“相框”:
imagepng()
→ 高清玻璃框(无损)imagejpeg()
→ 便携塑料框(有损压缩)imagewebp()
→ 智能电子相框📱
(二)GD库:无所不能的图片加工厂
GD库就像一家「全能图片加工厂」🏭
1、原料车间(创建图像)
imagecreatetruecolor()
:领一块空白画布(纯白底)imagecreatefromjpeg()
:进货现成的照片原料(像搬来整箱苹果)
2、加工流水线(图像处理)
裁剪工
imagecrop()
:把照片切掉多余边角(像切掉苹果坏的部分)缩放机
imagescale()
:调整照片尺寸(像把大苹果压缩成小果盘)旋转臂
imagerotate()
:把歪斜的照片摆正(像扶正倒下的瓶子)调色师
imagefilter()
:给照片加滤镜(像给苹果打蜡增亮)
3、包装部门(输出成品)
imagejpeg()
:打包成通用快递箱(兼容所有设备)imagepng()
:用高级保鲜盒包装(保留更多细节)imagewebp()
:用真空压缩袋打包(体积最小)
4、特殊工种
水印印章
imagestring()
:给照片盖版权章(像在苹果贴商标)像素点焊工
imagesetpixel()
:修复照片瑕疵(像补苹果表面的疤)透视玻璃
imagealphablending()
:做透明叠加效果(像把苹果放在玻璃板上拍照)
5、工厂特色
来料加工:不支持凭空造物(必须先有图像资源)
全手工操作:每个步骤都要写代码指令(没有图形按钮界面)
瞬时生产:图片生成完立刻清空流水线(需手动销毁资源)
三、GD库函数总体列表
以下是PHP GD库所有函数的完整列表(基于GD 2.3.3版本),按功能分类逐条列出,共7大类64个:
(一)图像信息获取
gd_info()
- 获取当前GD库的安装信息imagetypes()
- 返回支持的图像类型(如IMG_PNG|IMG_JPG等)getimagesize()
- 获取图像尺寸及类型信息imagesx()
- 获取图像宽度imagesy()
- 获取图像高度imageistruecolor()
- 检查图像是否为真彩色
(二)图像创建与加载
imagecreate()
- 创建基于调色板的图像imagecreatetruecolor()
- 创建真彩色图像imagecreatefromgd()
- 从GD格式文件创建图像imagecreatefromgd2()
- 从GD2格式文件创建图像imagecreatefromgd2part()
- 从GD2文件部分区域创建图像imagecreatefromgif()
- 从GIF文件创建图像imagecreatefromjpeg()
- 从JPEG文件创建图像imagecreatefrompng()
- 从PNG文件创建图像imagecreatefromstring()
- 从二进制字符串创建图像imagecreatefromwbmp()
- 从WBMP文件创建图像imagecreatefromxbm()
- 从XBM文件创建图像imagecreatefromxpm()
- 从XPM文件创建图像imagecreatefromwebp()
- 从WebP文件创建图像
(三)颜色与透明度
imagecolorallocate()
- 分配颜色(RGB)imagecolorallocatealpha()
- 分配带透明度的颜色imagecolordeallocate()
- 释放颜色资源imagecolortransparent()
- 设置透明色imagecolorat()
- 获取某像素点的颜色索引imagecolorsforindex()
- 获取颜色索引的RGB值imagecolorset()
- 修改调色板中的颜色imagecolorstotal()
- 返回调色板中的颜色数
(四)绘图与文本
imageline()
- 绘制直线imagerectangle()
- 绘制矩形imagefilledrectangle()
- 绘制实心矩形imagepolygon()
- 绘制多边形imagefilledpolygon()
- 绘制实心多边形imagearc()
- 绘制椭圆弧imageellipse()
- 绘制椭圆imagefilledellipse()
- 绘制实心椭圆imagestring()
- 绘制水平文本(内置字体)imagestringup()
- 绘制垂直文本(内置字体)imagettftext()
- 用TrueType字体绘制文本imagechar()
- 绘制单个水平字符imagecharup()
- 绘制单个垂直字符
(五)图像处理
imagecopy()
- 复制图像部分区域imagecopyresized()
- 复制并调整大小(低质量)imagecopyresampled()
- 复制并调整大小(高质量)imagescale()
- 缩放图像imagecrop()
- 裁剪图像imagecropauto()
- 自动裁剪(如透明区域)imagerotate()
- 旋转图像imageflip()
- 翻转图像(水平/垂直)imagefilter()
- 应用滤镜(如模糊、灰度等)imagesavealpha()
- 保存PNG图像的Alpha通道
(六)图像输出
imagepng()
- 输出PNG图像imagejpeg()
- 输出JPEG图像(可设质量)imagegif()
- 输出GIF图像imagewbmp()
- 输出WBMP图像imagegd()
- 输出GD格式图像imagegd2()
- 输出GD2格式图像imagewebp()
- 输出WebP图像
(七)其他功能
imagealphablending()
- 设置混色模式imageantialias()
- 启用抗锯齿imageinterlace()
- 设置隔行扫描imagesetthickness()
- 设置线条宽度imagesetpixel()
- 绘制单个像素点iptcembed()
- 嵌入IPTC数据到JPEGiptcparse()
- 解析IPTC数据块
完整度说明
部分函数如
imagefttext()
(FreeType文本)需额外扩展支持WebP相关函数需GD库编译时启用WebP支持
实际可用函数可能因PHP版本和GD库编译选项而异
四、GD库图像信息获取类函数用法详解(6个)
1、gd_info() - 获取GD库安装信息
语法结构
array gd_info(void)
功能说明
该函数返回一个关联数组,包含当前安装的GD库的版本信息和功能支持情况15。
返回参数详解
返回的数组包含以下键值对:
GD Version
: GD库版本号(字符串)FreeType Support
: 是否支持FreeType字体(布尔值)FreeType Linkage
: FreeType链接方式(字符串)GIF Read Support
: 是否支持读取GIF图像(布尔值)GIF Create Support
: 是否支持创建GIF图像(布尔值)JPEG Support
: 是否支持JPEG图像(布尔值)PNG Support
: 是否支持PNG图像(布尔值)WBMP Support
: 是否支持WBMP图像(布尔值)XPM Support
: 是否支持XPM图像(布尔值)XBM Support
: 是否支持XBM图像(布尔值)WebP Support
: 是否支持WebP图像(布尔值)BMP Support
: 是否支持BMP图像(布尔值)JIS-mapped Japanese Font Support
: 是否支持JIS映射的日文字体(布尔值)
示例代码及解析
<?php
// 获取GD库信息
$gd_info = gd_info();
// 输出GD库版本
echo "GD版本: " . $gd_info['GD Version'] . "\n";
// 检查PNG支持
if ($gd_info['PNG Support']) {echo "支持PNG格式\n";
} else {echo "不支持PNG格式\n";
}
// 打印全部信息
print_r($gd_info);
?>
代码解析:
gd_info()
调用返回一个包含GD库信息的数组通过数组键名访问特定信息,如
GD Version
获取版本号检查特定功能支持情况,如
PNG Support
判断PNG支持print_r
打印全部GD库信息
注意事项
使用前应确保GD库已安装并启用5
不同PHP版本返回的数组内容可能有所不同
某些功能可能依赖于系统库,如FreeType需要安装freetype库
2、imagetypes() - 返回支持的图像类型
语法结构
int imagetypes(void)
功能说明
返回当前GD库支持的图像格式的位掩码值,可以与以下常量进行按位与(&)操作来判断是否支持特定格式5:
IMG_GIF
: GIF格式IMG_JPG
: JPEG格式IMG_PNG
: PNG格式IMG_WBMP
: WBMP格式IMG_WEBP
: WebP格式IMG_BMP
: BMP格式IMG_XPM
: XPM格式
返回值
返回一个整数,表示支持的图像类型的位掩码组合。
示例代码及解析
<?php
// 获取支持的图像类型
$supported = imagetypes();
// 检查支持情况
if ($supported & IMG_PNG) {echo "支持PNG格式\n";
}
if ($supported & IMG_JPG) {echo "支持JPEG格式\n";
}
if ($supported & IMG_GIF) {echo "支持GIF格式\n";
}
// 输出所有支持的格式
echo "支持的格式: ";
$types = [];
if ($supported & IMG_GIF) $types[] = "GIF";
if ($supported & IMG_JPG) $types[] = "JPEG";
if ($supported & IMG_PNG) $types[] = "PNG";
if ($supported & IMG_WBMP) $types[] = "WBMP";
if ($supported & IMG_WEBP) $types[] = "WEBP";
if ($supported & IMG_BMP) $types[] = "BMP";
if ($supported & IMG_XPM) $types[] = "XPM";
echo implode(", ", $types);
?>
代码解析:
imagetypes()
返回支持的图像类型位掩码使用按位与(&)操作检查特定格式支持
构建数组收集所有支持的格式名称
使用
implode
将数组转换为逗号分隔的字符串输出
注意事项
返回值是位掩码,需要使用按位操作判断支持情况
不同PHP版本支持的常量可能不同
实际支持情况还取决于GD库编译时的配置
3、getimagesize() - 获取图像尺寸及类型信息
语法结构
array|false getimagesize(string $filename, array &$image_info = null)
参数说明
$filename
: 要检查的图像文件名(字符串)$image_info
: 可选参数,用于存储额外图像信息(数组引用)
返回值
成功时返回包含7个元素的数组,失败返回false。数组元素:
图像宽度(像素)
图像高度(像素)
图像类型常量(IMAGETYPE_XXX)
包含width/height属性的字符串,可直接用于HTML的
<img>
标签图像的MIME类型
颜色通道数(3表示RGB, 4表示RGBA)
位深度(每像素位数)
图像类型常量
IMAGETYPE_GIF
IMAGETYPE_JPEG
IMAGETYPE_PNG
IMAGETYPE_SWF
IMAGETYPE_PSD
IMAGETYPE_BMP
IMAGETYPE_WBMP
IMAGETYPE_XBM
IMAGETYPE_WEBP
示例代码及解析
<?php
// 获取图像信息
$image_file = "example.jpg";
$size = getimagesize($image_file, $info);
if ($size === false) {die("无法获取图像信息");
}
// 输出基本信息
echo "宽度: " . $size[0] . "px\n";
echo "高度: " . $size[1] . "px\n";
echo "类型: " . image_type_to_extension($size[2]) . "\n";
echo "HTML属性: " . $size[3] . "\n";
echo "MIME类型: " . $size['mime'] . "\n";
// 输出额外信息(如果有)
if (!empty($info)) {echo "额外信息:\n";print_r($info);
}
// 使用list获取各个值
list($width, $height, $type, $attr) = getimagesize($image_file);
echo "使用list解构: $width x $height ($type)";
?>
代码解析:
调用
getimagesize()
获取图像信息检查返回值是否为false(失败)
访问数组元素获取各种信息
使用
image_type_to_extension()
将类型常量转换为扩展名使用
list()
解构数组获取各个值
注意事项
文件必须存在且可读
支持本地文件和URL(如果allow_url_fopen启用)
对于非常大的图像可能消耗较多内存
某些图像格式可能无法正确识别
4、imagesx() - 获取图像宽度
语法结构
int imagesx(resource $image)
参数说明
$image
: 由图像创建函数(如imagecreatetruecolor
)返回的图像资源
返回值
返回图像的宽度(像素),失败时返回0。
示例代码及解析
<?php
// 创建图像资源
$width = 200;
$height = 100;
$image = imagecreatetruecolor($width, $height);
// 获取宽度
$image_width = imagesx($image);
echo "图像宽度: " . $image_width . "px\n";
// 与创建时的宽度比较
if ($image_width == $width) {echo "宽度匹配\n";
}
// 销毁资源
imagedestroy($image);
?>
代码解析:
使用
imagecreatetruecolor()
创建图像资源使用
imagesx()
获取图像宽度验证获取的宽度是否与创建时一致
使用
imagedestroy()
释放资源
注意事项
参数必须是有效的图像资源
对于空资源或无效资源返回0
通常与
imagesy()
一起使用获取完整尺寸
5、imagesy() - 获取图像高度
语法结构
int imagesy(resource $image)
参数说明
$image
: 由图像创建函数返回的图像资源
返回值
返回图像的高度(像素),失败时返回0。
示例代码及解析
<?php
// 从文件创建图像资源
$filename = "example.png";
$image = imagecreatefrompng($filename);
// 获取高度
$image_height = imagesy($image);
echo "图像高度: " . $image_height . "px\n";
// 计算宽高比
$ratio = imagesx($image) / $image_height;
echo "宽高比: " . number_format($ratio, 2) . "\n";
// 销毁资源
imagedestroy($image);
?>
代码解析:
使用
imagecreatefrompng()
从文件创建图像资源使用
imagesy()
获取图像高度结合
imagesx()
计算宽高比使用
number_format()
格式化输出使用
imagedestroy()
释放资源
注意事项
参数必须是有效的图像资源
对于空资源或无效资源返回0
通常与
imagesx()
配合使用
6、imageistruecolor() - 检查图像是否为真彩色
语法结构
bool imageistruecolor(resource $image)
参数说明
$image
: 由图像创建函数返回的图像资源
返回值
如果是真彩色图像返回true,否则返回false。
真彩色与调色板图像区别
真彩色图像: 每个像素直接存储RGB值(24位或32位)
调色板图像: 使用颜色索引表,每个像素存储索引值(通常8位)
示例代码及解析
<?php
// 创建真彩色图像
$truecolor = imagecreatetruecolor(100, 100);
// 创建调色板图像
$palette = imagecreate(100, 100);
// 检查图像类型
echo "真彩色图像: " . (imageistruecolor($truecolor) ? "是" : "否") . "\n";
echo "调色板图像: " . (imageistruecolor($palette) ? "是" : "否") . "\n";
// 转换图像类型
$converted = imagepalettetotruecolor($palette);
echo "转换后: " . (imageistruecolor($converted) ? "是" : "否") . "\n";
// 销毁资源
imagedestroy($truecolor);
imagedestroy($palette);
imagedestroy($converted);
?>
代码解析:
使用
imagecreatetruecolor()
创建真彩色图像使用
imagecreate()
创建调色板图像使用
imageistruecolor()
检查图像类型使用
imagepalettetotruecolor()
转换图像类型再次检查转换后的图像类型
释放所有图像资源
注意事项
真彩色图像支持更多颜色但占用更多内存
某些函数(如
imagetruecolortopalette
)需要特定类型图像可以使用
imagepalettetotruecolor()
将调色板图像转换为真彩色
GD库中图像信息获取类的6个函数综合比较表
函数名 | 参数 | 返回值 | 主要用途 | 相关函数 |
---|---|---|---|---|
gd_info() | 无 | 数组 | 获取GD库安装信息 | phpinfo() |
imagetypes() | 无 | 整数(位掩码) | 获取支持的图像类型 | image_type_to_mime_type() |
getimagesize() | 文件名,[&info] | 数组/false | 获取图像尺寸和类型 | getimagesizefromstring() |
imagesx() | 图像资源 | 整数 | 获取图像宽度 | imagesy() , getimagesize() |
imagesy() | 图像资源 | 整数 | 获取图像高度 | imagesx() , getimagesize() |
imageistruecolor() | 图像资源 | 布尔值 | 检查图像类型 | imagecreatetruecolor() , imagecreate() |
五、GD库图像创建与加载类函数用法详解(13个)
1、imagecreate() - 创建基于调色板的图像
语法结构
resource|false imagecreate(int $width, int $height)
参数说明
$width
: 图像宽度(像素),必须大于0$height
: 图像高度(像素),必须大于0
返回值
成功返回图像资源标识符,失败返回false。
示例代码及解析
<?php
// 创建200x100像素的调色板图像
$width = 200;
$height = 100;
$image = imagecreate($width, $height);
// 检查是否创建成功
if ($image === false) {die("无法创建图像资源");
}
// 分配背景色(红色)
$bg_color = imagecolorallocate($image, 255, 0, 0);
// 填充背景
imagefill($image, 0, 0, $bg_color);
// 输出图像
header('Content-Type: image/png');
imagepng($image);
// 释放资源
imagedestroy($image);
?>
代码解析:
imagecreate()
创建调色板图像,指定宽高检查返回值是否为false(创建失败)
imagecolorallocate()
分配颜色(红色)imagefill()
填充背景设置HTTP头并输出PNG图像
imagedestroy()
释放资源
注意事项
调色板图像最多支持256色
第一个分配的颜色自动成为背景色
性能比真彩色图像好但色彩表现有限
2、imagecreatetruecolor() - 创建真彩色图像
语法结构
resource|false imagecreatetruecolor(int $width, int $height)
参数说明
$width
: 图像宽度(像素),必须大于0$height
: 图像高度(像素),必须大于0
返回值
成功返回图像资源标识符,失败返回false。
示例代码及解析
<?php
// 创建400x300的真彩色图像
$image = imagecreatetruecolor(400, 300);
// 创建渐变色背景
for ($y = 0; $y < 300; $y++) {$color = imagecolorallocate($image, 0, $y/300*255, 255-$y/300*255);imageline($image, 0, $y, 399, $y, $color);
}
// 添加文字
$text_color = imagecolorallocate($image, 255, 255, 255);
imagestring($image, 5, 150, 140, "TrueColor", $text_color);
// 输出
header('Content-Type: image/jpeg');
imagejpeg($image, null, 90);
// 释放
imagedestroy($image);
?>
代码解析:
创建400x300真彩色图像
使用循环创建垂直渐变背景
添加白色文字
输出JPEG图像(质量90)
释放资源
注意事项
支持16.7百万色(24位)
默认背景为黑色
适合照片等高质量图像处理
3、imagecreatefromgd() - 从GD格式文件创建图像
语法结构
resource|false imagecreatefromgd(string $filename)
参数说明
$filename
: GD格式图像文件路径
返回值
成功返回图像资源标识符,失败返回false。
示例代码及解析
<?php
// 从GD文件创建图像
$gd_file = "example.gd";
$image = imagecreatefromgd($gd_file);
if ($image === false) {die("无法加载GD文件");
}
// 获取图像信息
$width = imagesx($image);
$height = imagesy($image);
// 转换为PNG输出
header('Content-Type: image/png');
imagepng($image);
// 释放
imagedestroy($image);
?>
代码解析:
从GD格式文件加载图像
检查是否加载成功
获取图像尺寸
转换为PNG格式输出
释放资源
注意事项
GD格式是GD库的原始格式
现在很少使用,主要用于遗留系统
文件通常以.gd为扩展名
4、imagecreatefromgd2() - 从GD2格式文件创建图像
语法结构
resource|false imagecreatefromgd2(string $filename)
参数说明
$filename
: GD2格式图像文件路径
返回值
成功返回图像资源标识符,失败返回false。
示例代码及解析
<?php
// 从GD2文件创建图像
$image = imagecreatefromgd2("texture.gd2");
if (!$image) {// 尝试创建新图像作为后备$image = imagecreatetruecolor(100, 100);$color = imagecolorallocate($image, 200, 200, 200);imagefill($image, 0, 0, $color);
}
// 输出
header('Content-Type: image/png');
imagepng($image);
imagedestroy($image);
?>
代码解析:
尝试加载GD2文件
如果失败则创建新的灰色图像
输出PNG图像
释放资源
注意事项
GD2是GD格式的改进版
支持分块存储提高大图像处理效率
现代应用中也较少使用
5、imagecreatefromgd2part() - 从GD2文件部分区域创建图像
语法结构
resource|false imagecreatefromgd2part(string $filename, int $srcX, int $srcY, int $width, int $height
)
参数说明
$filename
: GD2格式图像文件路径$srcX
: 源图像左上角x坐标$srcY
: 源图像左上角y坐标$width
: 要截取的宽度$height
: 要截取的高度
返回值
成功返回图像资源标识符,失败返回false。
示例代码及解析
<?php
// 从GD2文件截取100x100的区域(从50,50开始)
$image = imagecreatefromgd2part("large_image.gd2", 50, 50, 100, 100);
if ($image === false) {die("无法截取图像区域");
}
// 添加边框
$border_color = imagecolorallocate($image, 255, 0, 0);
imagerectangle($image, 0, 0, 99, 99, $border_color);
// 输出
header('Content-Type: image/jpeg');
imagejpeg($image);
imagedestroy($image);
?>
代码解析:
从GD2文件截取指定区域
检查是否成功
添加红色边框标记截取区域
输出JPEG图像
释放资源
注意事项
适用于处理大型GD2图像的部分区域
坐标和尺寸不能超出原图范围
必须先确保GD2文件有效
6、imagecreatefromgif() - 从GIF文件创建图像
语法结构
resource|false imagecreatefromgif(string $filename)
参数说明
$filename
: GIF图像文件路径
返回值
成功返回图像资源标识符,失败返回false。
示例代码及解析
<?php
// 从GIF文件创建图像
$gif_file = "animation.gif";
$image = imagecreatefromgif($gif_file);
if (!$image) {die("无法加载GIF图像");
}
// 如果是动画GIF,只获取第一帧
// 转换为PNG输出
header('Content-Type: image/png');
imagepng($image);
// 获取图像尺寸
echo "宽度: " . imagesx($image) . "px, 高度: " . imagesy($image) . "px";
imagedestroy($image);
?>
代码解析:
加载GIF文件
检查是否成功
输出PNG格式(只输出第一帧)
获取并显示图像尺寸
释放资源
注意事项
动画GIF只读取第一帧
某些GIF版本可能不支持
透明度信息会被保留
7、imagecreatefromjpeg() - 从JPEG文件创建图像
语法结构
resource|false imagecreatefromjpeg(string $filename)
参数说明
$filename
: JPEG图像文件路径
返回值
成功返回图像资源标识符,失败返回false。
示例代码及解析
<?php
// 从JPEG创建图像(带错误处理)
try {$image = @imagecreatefromjpeg("photo.jpg");if ($image === false) {throw new Exception("无法加载JPEG图像");}// 添加水印$watermark_color = imagecolorallocatealpha($image, 255, 255, 255, 60);imagestring($image, 5, 10, 10, "SAMPLE", $watermark_color);// 输出高质量JPEGheader('Content-Type: image/jpeg');imagejpeg($image, null, 95);} catch (Exception $e) {// 创建错误替代图像$image = imagecreatetruecolor(400, 300);$bg = imagecolorallocate($image, 200, 200, 200);imagefill($image, 0, 0, $bg);$text_color = imagecolorallocate($image, 255, 0, 0);imagestring($image, 5, 150, 140, $e->getMessage(), $text_color);header('Content-Type: image/jpeg');imagejpeg($image);
} finally {if (isset($image)) {imagedestroy($image);}
}
?>
代码解析:
使用错误抑制符@和try-catch处理错误
加载JPEG图像
添加半透明水印
输出高质量JPEG
出错时创建错误提示图像
确保资源被释放
注意事项
支持渐进式JPEG
大图像可能消耗较多内存
建议使用错误处理机制
8、imagecreatefrompng() - 从PNG文件创建图像
语法结构
resource|false imagecreatefrompng(string $filename)
参数说明
$filename
: PNG图像文件路径
返回值
成功返回图像资源标识符,失败返回false。
示例代码及解析
<?php
// 从PNG创建图像并保留透明度
$png_file = "transparent.png";
$image = imagecreatefrompng($png_file);
if ($image === false) {die("无法加载PNG图像");
}
// 确保保留透明度
imagealphablending($image, false);
imagesavealpha($image, true);
// 创建新图像并合并
$new_image = imagecreatetruecolor(imagesx($image), imagesy($image));
$white = imagecolorallocate($new_image, 255, 255, 255);
imagefill($new_image, 0, 0, $white);
imagecopy($new_image, $image, 0, 0, 0, 0, imagesx($image), imagesy($image));
// 输出
header('Content-Type: image/png');
imagepng($new_image);
// 释放
imagedestroy($image);
imagedestroy($new_image);
?>
代码解析:
加载PNG图像
设置保留透明度
创建新白色背景图像
合并原图(带透明度)到新图像
输出PNG
释放两个图像资源
注意事项
必须正确处理alpha通道
imagesavealpha()
是关键适合处理带透明度的图形
9、imagecreatefromstring() - 从二进制字符串创建图像
语法结构
resource|false imagecreatefromstring(string $image_data)
参数说明
$image_data
: 包含图像数据的字符串
返回值
成功返回图像资源标识符,失败返回false。
示例代码及解析
<?php
// 从Base64字符串创建图像
$base64_string = "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEX///8AAABVwtN+AAAAE0lEQVR4XmP8z0A8YIKMYYKMAX4gBBcAMfQJiAAAAABJRU5ErkJggg==";
$binary_data = base64_decode($base64_string);
// 尝试从字符串创建图像
$image = imagecreatefromstring($binary_data);
if ($image === false) {die("无效的图像数据");
}
// 获取图像类型
$type = getimagesizefromstring($binary_data)[2];
$types = [IMAGETYPE_GIF => "GIF",IMAGETYPE_JPEG => "JPEG",IMAGETYPE_PNG => "PNG",IMAGETYPE_WEBP => "WEBP"
];
// 输出
header('Content-Type: image/' . strtolower($types[$type]));
switch ($type) {case IMAGETYPE_GIF: imagegif($image); break;case IMAGETYPE_JPEG: imagejpeg($image); break;case IMAGETYPE_PNG: imagepng($image); break;case IMAGETYPE_WEBP: imagewebp($image); break;
}
imagedestroy($image);
?>
代码解析:
解码Base64图像数据
从二进制字符串创建图像
使用
getimagesizefromstring()
检测图像类型根据类型输出正确格式
释放资源
注意事项
可以自动检测多种格式
适合处理数据库存储的图像
必须确保字符串是有效的图像数据
10、imagecreatefromwbmp() - 从WBMP文件创建图像
语法结构
resource|false imagecreatefromwbmp(string $filename)
参数说明
$filename
: WBMP图像文件路径
返回值
成功返回图像资源标识符,失败返回false。
示例代码及解析
<?php
// 从WBMP创建图像(无线位图)
$wbmp_file = "graphic.wbmp";
$image = imagecreatefromwbmp($wbmp_file);
if ($image === false) {die("无法加载WBMP图像");
}
// 转换为PNG输出
header('Content-Type: image/png');
imagepng($image);
// 获取图像信息
$width = imagesx($image);
$height = imagesy($image);
$is_truecolor = imageistruecolor($image);
echo "尺寸: {$width}x{$height}, 类型: " . ($is_truecolor ? "真彩色" : "调色板");
imagedestroy($image);
?>
代码解析:
加载WBMP文件
检查是否成功
转换为PNG输出
获取并显示图像信息
释放资源
注意事项
WBMP是单色位图格式
主要用于移动设备
现代应用中较少使用
11、imagecreatefromxbm() - 从XBM文件创建图像
语法结构
resource|false imagecreatefromxbm(string $filename)
参数说明
$filename
: XBM图像文件路径
返回值
成功返回图像资源标识符,失败返回false。
示例代码及解析
<?php
// 从XBM创建图像(X BitMap)
$xbm_file = "icon.xbm";
$image = imagecreatefromxbm($xbm_file);
if ($image === false) {die("无法加载XBM图像");
}
// 分配颜色(反转颜色)
$bg = imagecolorallocate($image, 255, 255, 255);
$fg = imagecolorallocate($image, 0, 0, 0);
// 重新绘制图像
for ($y = 0; $y < imagesy($image); $y++) {for ($x = 0; $x < imagesx($image); $x++) {$color = imagecolorat($image, $x, $y);imagesetpixel($image, $x, $y, $color ? $bg : $fg);}
}
// 输出
header('Content-Type: image/png');
imagepng($image);
imagedestroy($image);
?>
代码解析:
加载XBM文件
检查是否成功
分配黑白颜色
反转XBM颜色(通常XBM是黑底白图)
输出PNG图像
释放资源
注意事项
XBM是ASCII编码的位图格式
常用于X Window系统
本质上是C语言源代码
12、imagecreatefromxpm() - 从XPM文件创建图像
语法结构
resource|false imagecreatefromxpm(string $filename)
参数说明
$filename
: XPM图像文件路径
返回值
成功返回图像资源标识符,失败返回false。
XPM格式特点
XPM(X PixMap)是:
基于ASCII文本的图像格式
使用C语言语法定义
支持颜色名称和透明度
常用于Unix/Linux系统图标
示例代码及解析
<?php
// 检查XPM支持
if (!function_exists('imagecreatefromxpm')) {die("您的GD库不支持XPM格式");
}
// 从XPM文件创建图像
$xpm_file = "icon.xpm";
$image = imagecreatefromxpm($xpm_file);
if ($image === false) {// 创建替代图像$image = imagecreatetruecolor(64, 64);$bg = imagecolorallocate($image, 240, 240, 240);$text_color = imagecolorallocate($image, 200, 0, 0);imagefill($image, 0, 0, $bg);imagestring($image, 3, 10, 25, "XPM Load Failed", $text_color);
} else {// 添加边框$border_color = imagecolorallocate($image, 100, 100, 100);imagerectangle($image, 0, 0, imagesx($image)-1, imagesy($image)-1, $border_color);
}
// 输出PNG
header('Content-Type: image/png');
imagepng($image);
// 释放资源
imagedestroy($image);
?>
代码解析:
首先检查XPM支持
尝试加载XPM文件
失败时创建错误提示图像
成功时添加边框
输出PNG格式
释放资源
注意事项
XPM文件本质是C源代码
需要GD库编译时启用XPM支持
文件通常有.xpm扩展名
适合处理小型图标类图像
13、imagecreatefromwebp() - 从WebP文件创建图像
语法结构
resource|false imagecreatefromwebp(string $filename)
参数说明
$filename
: WebP图像文件路径
返回值
成功返回图像资源标识符,失败返回false。
WebP格式特点
Google开发的现代图像格式
支持有损和无损压缩
支持透明度(alpha通道)
通常比JPEG/PNG更小的文件大小
示例代码及解析
<?php
// 从WebP创建图像(带透明度处理)
$webp_file = "photo.webp";
$image = imagecreatefromwebp($webp_file);
if ($image === false) {die("无法加载WebP图像");
}
// 获取图像信息
$width = imagesx($image);
$height = imagesy($image);
$is_truecolor = imageistruecolor($image);
// 创建新图像并保留透明度
$new_image = imagecreatetruecolor($width, $height);
imagealphablending($new_image, false);
imagesavealpha($new_image, true);
// 填充透明背景
$transparent = imagecolorallocatealpha($new_image, 0, 0, 0, 127);
imagefill($new_image, 0, 0, $transparent);
// 合并图像
imagecopy($new_image, $image, 0, 0, 0, 0, $width, $height);
// 添加水印(半透明)
$watermark_color = imagecolorallocatealpha($new_image, 255, 255, 255, 60);
imagettftext($new_image, 20, 0, 10, 30, $watermark_color, 'arial.ttf', 'WATERMARK');
// 输出
header('Content-Type: image/webp');
imagewebp($new_image, null, 90); // 质量90
// 释放资源
imagedestroy($image);
imagedestroy($new_image);
?>
代码解析:
加载WebP图像
获取图像尺寸和类型信息
创建新图像并设置alpha通道处理
填充透明背景
复制原图像到新图像
添加半透明水印(使用TrueType字体)
输出WebP格式(质量90)
释放两个图像资源
注意事项
需要GD库2.1.0及以上版本
必须正确处理alpha通道
输出质量参数范围0-100
适合需要高压缩率的Web应用
GD库中图像创建与加载类13个函数综合比较表
函数名称 | 功能描述 | 支持格式 | 内存消耗 | 透明度支持 | 常见用途 | 注意事项 |
imagecreate() | 创建基于调色板的图像 | 无 | 低 | 不支持 | 简单图形绘制 | 仅支持256色,渐变色可能出现色带 |
imagecreatetruecolor() | 创建真彩色图像(24/32位) | 无 | 较高 | 支持 | 照片处理/复杂图形 | 必须用imagealphablending()启用透明通道 |
imagecreatefromgd() | 从GD格式文件加载图像 | .gd | 中等 | 视源文件 | 读取GD专用格式 | 该格式已逐渐淘汰 |
imagecreatefromgd2() | 加载完整GD2格式图像 | .gd2 | 中等 | 视源文件 | 读取分块存储的GD2文件 | 文件需完整保存 |
imagecreatefromgd2part() | 加载GD2文件的部分区域 | .gd2 | 可变 | 视源文件 | 大图像局部处理 | 需精确指定(x,y,width,height)坐标 |
imagecreatefromgif() | 从GIF文件创建图像资源 | .gif | 中等 | 支持 | 动画帧提取/简单图标 | PHP5.6+移除动画支持 |
imagecreatefromjpeg() | 从JPEG文件创建图像资源 | .jpg | 高 | 不支持 | 照片处理 | 质量损失不可逆 |
imagecreatefrompng() | 从PNG文件创建图像资源 | .png | 较高 | 支持 | 透明图像处理 | 保留alpha通道需设置imagesavealpha(true) |
imagecreatefromstring() | 解析二进制字符串为图像 | 多格式 | 视内容 | 视格式 | 网络图像处理 | 需先验证字符串有效性 |
imagecreatefromwbmp() | 加载WBMP(无线位图)格式 | .wbmp | 低 | 不支持 | 移动设备兼容图像 | 仅支持单色位图 |
imagecreatefromxbm() | 加载XBM(X BitMap)格式 | .xbm | 低 | 不支持 | 黑白图标处理 | 格式常见于Unix系统 |
imagecreatefromxpm() | 加载XPM(X PixMap)格式 | .xpm | 中等 | 支持 | Linux系统图标 | 需服务器安装X11库 |
imagecreatefromwebp() | 从WebP文件创建图像资源 | .webp | 中等 | 支持 | 现代网页图像 | PHP需编译时启用WebP支持 |
通用注意事项
资源管理:所有图像资源都应使用
imagedestroy()
释放错误处理:应检查每个函数返回值是否为false
内存考虑:大图像会消耗大量内存
格式支持:不同服务器GD库配置可能支持不同格式
文件权限:确保PHP有权限读取源文件
输出缓冲:输出图像前确保没有其他输出
六、GD库颜色与透明度类函数用法详解(8个)
1、imagecolorallocate() - 分配颜色(RGB)
语法结构
int|false imagecolorallocate(resource $image, int $red, int $green, int $blue)
参数说明
$image
: 图像资源$red
: 红色分量(0-255)$green
: 绿色分量(0-255)$blue
: 蓝色分量(0-255)
返回值
成功返回颜色索引值,失败返回false。
示例代码及解析
<?php
// 创建200x200图像
$image = imagecreatetruecolor(200, 200);
// 分配三种颜色
$red = imagecolorallocate($image, 255, 0, 0); // 纯红
$green = imagecolorallocate($image, 0, 255, 0); // 纯绿
$blue = imagecolorallocate($image, 0, 0, 255); // 纯蓝
// 绘制彩色条纹
for ($i = 0; $i < 200; $i++) {$color = $i < 70 ? $red : ($i < 140 ? $green : $blue);imageline($image, 0, $i, 199, $i, $color);
}
// 输出
header('Content-Type: image/png');
imagepng($image);
imagedestroy($image);
?>
代码解析:
创建200x200真彩色图像
分配红、绿、蓝三种颜色
使用循环绘制三色条纹
输出PNG图像
释放资源
注意事项
调色板图像中第一个分配的颜色自动成为背景色
颜色索引只在当前图像资源中有效
真彩色图像支持更多颜色分配
2、imagecolorallocatealpha() - 分配带透明度的颜色
语法结构
int|false imagecolorallocatealpha(resource $image, int $red, int $green, int $blue, int $alpha
)
参数说明
$image
: 图像资源$red
: 红色分量(0-255)$green
: 绿色分量(0-255)$blue
: 蓝色分量(0-255)$alpha
: 透明度(0-127),0完全不透明,127完全透明
返回值
成功返回颜色索引值,失败返回false。
示例代码及解析
<?php
// 创建透明背景图像
$image = imagecreatetruecolor(300, 200);
imagealphablending($image, false); // 关闭混合模式
imagesavealpha($image, true); // 保存alpha通道
// 分配透明色和半透明色
$transparent = imagecolorallocatealpha($image, 0, 0, 0, 127); // 完全透明
$semi_blue = imagecolorallocatealpha($image, 0, 0, 255, 60); // 半透明蓝
// 填充透明背景
imagefill($image, 0, 0, $transparent);
// 绘制半透明圆形
imagefilledellipse($image, 150, 100, 180, 180, $semi_blue);
// 输出
header('Content-Type: image/png');
imagepng($image);
imagedestroy($image);
?>
代码解析:
创建真彩色图像并设置alpha处理
分配完全透明和半透明蓝色
填充透明背景
绘制半透明圆形
输出PNG(保留透明度)
释放资源
注意事项
必须配合
imagesavealpha()
使用仅适用于真彩色图像
alpha值越大越透明
3、imagecolordeallocate() - 释放颜色资源
语法结构
bool imagecolordeallocate(resource $image, int $color)
参数说明
$image
: 图像资源$color
: 要释放的颜色索引
返回值
成功返回true,失败返回false。
示例代码及解析
<?php
// 创建图像
$image = imagecreate(100, 100);
// 分配多个颜色
$color1 = imagecolorallocate($image, 255, 0, 0);
$color2 = imagecolorallocate($image, 0, 255, 0);
$color3 = imagecolorallocate($image, 0, 0, 255);
// 使用颜色
imagefill($image, 0, 0, $color1);
// 释放不再需要的颜色
imagecolordeallocate($image, $color2);
imagecolordeallocate($image, $color3);
// 检查调色板颜色数
echo "调色板颜色数: " . imagecolorstotal($image) . "\n";
// 输出
header('Content-Type: image/png');
imagepng($image);
imagedestroy($image);
?>
代码解析:
创建调色板图像
分配三种颜色
使用第一种颜色填充
释放未使用的两种颜色
检查调色板颜色数
输出图像并释放资源
注意事项
主要用于调色板图像节省资源
真彩色图像通常不需要手动释放
不能释放正在使用的颜色
4、imagecolortransparent() - 设置透明色
语法结构
int imagecolortransparent(resource $image, int $color = -1)
参数说明
$image
: 图像资源$color
: 要设置为透明的颜色索引(默认-1表示取消透明色)
返回值
返回当前的透明色索引,如果没有透明色则返回-1。
示例代码及解析
<?php
// 创建调色板图像
$image = imagecreate(200, 200);
// 分配颜色(第一个自动成为背景色)
$bg = imagecolorallocate($image, 255, 255, 255); // 白色背景
$red = imagecolorallocate($image, 255, 0, 0);
$green = imagecolorallocate($image, 0, 255, 0);
// 设置白色为透明色
imagecolortransparent($image, $bg);
// 绘制图形
imagefilledrectangle($image, 50, 50, 150, 150, $red);
imagefilledellipse($image, 100, 100, 80, 80, $green);
// 输出
header('Content-Type: image/png');
imagepng($image);
imagedestroy($image);
?>
代码解析:
创建调色板图像
分配颜色(白色自动成为背景)
设置白色为透明色
绘制红色矩形和绿色圆形
输出PNG(背景透明)
释放资源
注意事项
主要用于GIF等调色板图像
真彩色图像应使用alpha通道
只能设置一种颜色为透明
5、imagecolorat() - 获取某像素点的颜色索引
语法结构
int imagecolorat(resource $image, int $x, int $y)
参数说明
$image
: 图像资源$x
: 像素点的x坐标$y
: 像素点的y坐标
返回值
返回像素点的颜色索引值。
示例代码及解析
<?php
// 创建渐变图像
$image = imagecreatetruecolor(100, 100);
for ($y = 0; $y < 100; $y++) {for ($x = 0; $x < 100; $x++) {$color = imagecolorallocate($image, $x*2.55, $y*2.55, 0);imagesetpixel($image, $x, $y, $color);}
}
// 获取中心点颜色
$center_color = imagecolorat($image, 50, 50);
// 转换为RGB值
$rgb = imagecolorsforindex($image, $center_color);
echo "中心点颜色: R={$rgb['red']} G={$rgb['green']} B={$rgb['blue']}\n";
// 输出
header('Content-Type: image/png');
imagepng($image);
imagedestroy($image);
?>
代码解析:
创建真彩色图像
使用双重循环创建渐变效果
获取中心点(50,50)颜色值
转换为RGB数组并输出
输出图像并释放资源
注意事项
对于真彩色图像,返回值包含RGB信息
需要配合
imagecolorsforindex()
解析颜色值坐标必须在图像范围内
6、imagecolorsforindex() - 获取颜色索引的RGB值
语法结构
array imagecolorsforindex(resource $image, int $color)
参数说明
$image
: 图像资源$color
: 颜色索引值
返回值
返回包含以下键的关联数组:
red
: 红色分量(0-255)green
: 绿色分量(0-255)blue
: 蓝色分量(0-255)alpha
: 透明度(0-127)
示例代码及解析
<?php
// 创建图像并分配颜色
$image = imagecreatetruecolor(1, 1);
$purple = imagecolorallocate($image, 128, 0, 128);
imagesetpixel($image, 0, 0, $purple);
// 获取颜色信息
$pixel_color = imagecolorat($image, 0, 0);
$color_info = imagecolorsforindex($image, $pixel_color);
// 输出颜色信息
echo "颜色分解:\n";
echo "红色: {$color_info['red']}\n";
echo "绿色: {$color_info['green']}\n";
echo "蓝色: {$color_info['blue']}\n";
echo "透明度: {$color_info['alpha']}\n";
// 释放资源
imagedestroy($image);
?>
代码解析:
创建1x1像素图像
分配紫色并设置像素
获取像素颜色值
分解颜色分量并输出
释放资源
注意事项
对于调色板图像,alpha值总是0
真彩色图像才能获取透明度信息
颜色索引必须有效
7、imagecolorset() - 修改调色板中的颜色
语法结构
void imagecolorset(resource $image, int $index, int $red, int $green, int $blue, int $alpha = 0
)
参数说明
$image
: 调色板图像资源$index
: 要修改的颜色索引$red
: 新的红色分量(0-255)$green
: 新的绿色分量(0-255)$blue
: 新的蓝色分量(0-255)$alpha
: 新的透明度值(0-127)
返回值
无返回值。
示例代码及解析
<?php
// 创建调色板图像
$image = imagecreate(100, 100);
// 分配颜色
$bg = imagecolorallocate($image, 200, 200, 200);
$color1 = imagecolorallocate($image, 255, 0, 0);
// 填充背景
imagefill($image, 0, 0, $bg);
// 修改红色为绿色
imagecolorset($image, $color1, 0, 255, 0);
// 使用修改后的颜色
imagefilledrectangle($image, 20, 20, 80, 80, $color1);
// 输出
header('Content-Type: image/png');
imagepng($image);
imagedestroy($image);
?>
代码解析:
创建调色板图像
分配灰色背景和红色
填充背景
将红色修改为绿色
绘制矩形(实际为绿色)
输出图像并释放资源
注意事项
仅适用于调色板图像
修改立即影响所有使用该索引的像素
不能修改调色板大小
8、imagecolorstotal() - 返回调色板中的颜色数
语法结构
int imagecolorstotal(resource $image)
参数说明
$image
: 调色板图像资源
返回值
返回调色板中的颜色数量,真彩色图像返回0。
示例代码及解析
<?php
// 创建调色板图像
$palette_image = imagecreate(100, 100);
// 分配多个颜色
imagecolorallocate($palette_image, 255, 0, 0); // 索引0
imagecolorallocate($palette_image, 0, 255, 0); // 索引1
imagecolorallocate($palette_image, 0, 0, 255); // 索引2
// 创建真彩色图像对比
$truecolor_image = imagecreatetruecolor(100, 100);
// 获取颜色数
echo "调色板图像颜色数: " . imagecolorstotal($palette_image) . "\n";
echo "真彩色图像颜色数: " . imagecolorstotal($truecolor_image) . "\n";
// 释放资源
imagedestroy($palette_image);
imagedestroy($truecolor_image);
?>
代码解析:
创建调色板图像并分配3种颜色
创建真彩色图像作为对比
分别获取两种图像的颜色数
释放资源
注意事项
调色板图像最多256色
真彩色图像始终返回0
已释放的颜色不计入总数
GD库中颜色与透明度类8个函数综合比较表
函数名 | 适用图像类型 | 主要功能 | 相关函数 |
---|---|---|---|
imagecolorallocate() | 全部 | 分配颜色 | imagecolorallocatealpha() |
imagecolorallocatealpha() | 真彩色 | 分配透明色 | imagesavealpha() |
imagecolordeallocate() | 调色板 | 释放颜色 | imagecolorstotal() |
imagecolortransparent() | 调色板 | 设置透明色 | imagecolorallocate() |
imagecolorat() | 全部 | 获取像素颜色 | imagecolorsforindex() |
imagecolorsforindex() | 全部 | 解析颜色值 | imagecolorat() |
imagecolorset() | 调色板 | 修改调色板 | imagecolorallocate() |
imagecolorstotal() | 调色板 | 统计颜色数 | imagecolordeallocate() |
七、GD库绘图与文本类函数用法详解(13个)
1、imageline() - 绘制直线
语法结构
bool imageline(resource $image, int $x1, int $y1, int $x2, int $y2, int $color
)
参数说明
$image
: 图像资源$x1
: 起点x坐标$y1
: 起点y坐标$x2
: 终点x坐标$y2
: 终点y坐标$color
: 线条颜色索引
返回值
成功返回true,失败返回false。
示例代码及解析
<?php
// 创建400x400图像
$image = imagecreatetruecolor(400, 400);
$white = imagecolorallocate($image, 255, 255, 255);
$red = imagecolorallocate($image, 255, 0, 0);
// 填充白色背景
imagefill($image, 0, 0, $white);
// 绘制十字线
imageline($image, 0, 200, 400, 200, $red); // 水平线
imageline($image, 200, 0, 200, 400, $red); // 垂直线
// 绘制对角线
imageline($image, 0, 0, 400, 400, $red); // 主对角线
imageline($image, 400, 0, 0, 400, $red); // 副对角线
// 输出
header('Content-Type: image/png');
imagepng($image);
imagedestroy($image);
?>
代码解析:
创建400x400真彩色图像
分配白色和红色
填充白色背景
绘制红色十字线(水平和垂直)
绘制两条红色对角线
输出PNG图像
释放资源
注意事项
坐标超出图像范围会被自动裁剪
抗锯齿效果需要额外处理
线宽固定为1像素
2、imagerectangle() - 绘制矩形
语法结构
bool imagerectangle(resource $image, int $x1, int $y1, int $x2, int $y2, int $color
)
参数说明
$image
: 图像资源$x1
: 左上角x坐标$y1
: 左上角y坐标$x2
: 右下角x坐标$y2
: 右下角y坐标$color
: 边框颜色索引
返回值
成功返回true,失败返回false。
示例代码及解析
<?php
// 创建300x300图像
$image = imagecreatetruecolor(300, 300);
$white = imagecolorallocate($image, 255, 255, 255);
$blue = imagecolorallocate($image, 0, 0, 255);
// 填充白色背景
imagefill($image, 0, 0, $white);
// 绘制嵌套矩形
for ($i = 0; $i < 10; $i++) {$offset = $i * 15;imagerectangle($image, $offset, $offset, 300-$offset, 300-$offset, $blue);
}
// 输出
header('Content-Type: image/jpeg');
imagejpeg($image, null, 90);
imagedestroy($image);
?>
代码解析:
创建300x300图像
分配白色和蓝色
填充白色背景
使用循环绘制10个嵌套蓝色矩形
输出JPEG图像(质量90)
释放资源
注意事项
矩形边框宽度固定为1像素
(x1,y1)和(x2,y2)可以任意顺序指定
填充矩形应使用
imagefilledrectangle()
3、imagefilledrectangle() - 绘制实心矩形
语法结构
bool imagefilledrectangle(resource $image, int $x1, int $y1, int $x2, int $y2, int $color
)
参数说明
参数同imagerectangle()
返回值
成功返回true,失败返回false。
示例代码及解析
<?php
// 创建256x256图像(用于颜色渐变)
$image = imagecreatetruecolor(256, 256);
// 创建颜色渐变(红到绿)
for ($x = 0; $x < 256; $x++) {$color = imagecolorallocate($image, $x, 255-$x, 0);imagefilledrectangle($image, $x, 0, $x, 255, $color);
}
// 添加文字
$text_color = imagecolorallocate($image, 255, 255, 255);
imagestring($image, 5, 80, 120, "Color Gradient", $text_color);
// 输出
header('Content-Type: image/png');
imagepng($image);
imagedestroy($image);
?>
代码解析:
创建256x256图像
使用循环创建从左到右的红绿渐变
每个垂直条1像素宽
添加白色文字
输出PNG图像
释放资源
注意事项
比绘制多个像素点效率更高
适合创建色块和背景
可以用于快速填充大面积区域
4、imagepolygon() - 绘制多边形
语法结构
bool imagepolygon(resource $image, array $points, int $num_points, int $color
)
参数说明
$image
: 图像资源$points
: 顶点坐标数组,格式为[x1,y1,x2,y2,...]$num_points
: 顶点总数(必须≥3)$color
: 边框颜色索引
返回值
成功返回true,失败返回false。
示例代码及解析
<?php
// 创建400x400图像
$image = imagecreatetruecolor(400, 400);
$white = imagecolorallocate($image, 255, 255, 255);
$purple = imagecolorallocate($image, 128, 0, 128);
// 填充白色背景
imagefill($image, 0, 0, $white);
// 定义五边形顶点
$points = [200, 50, // 顶点1350, 150, // 顶点2300, 350, // 顶点3100, 350, // 顶点450, 150 // 顶点5
];
// 绘制紫色五边形
imagepolygon($image, $points, 5, $purple);
// 输出
header('Content-Type: image/png');
imagepng($image);
imagedestroy($image);
?>
代码解析:
创建400x400图像
分配白色和紫色
填充白色背景
定义五边形的5个顶点坐标
绘制紫色五边形边框
输出PNG图像
释放资源
注意事项
顶点必须按顺序排列(顺时针或逆时针)
会自动闭合图形(连接首尾点)
填充多边形应使用
imagefilledpolygon()
5、imagefilledpolygon() - 绘制实心多边形
语法结构
bool imagefilledpolygon(resource $image, array $points, int $num_points, int $color
)
参数说明
参数同imagepolygon()
返回值
成功返回true,失败返回false。
示例代码及解析
<?php
// 创建500x500图像
$image = imagecreatetruecolor(500, 500);
$black = imagecolorallocate($image, 0, 0, 0);
$yellow = imagecolorallocate($image, 255, 255, 0);
// 填充黑色背景
imagefill($image, 0, 0, $black);
// 定义星形顶点(五角星)
$points = [250, 50, // 顶点1294, 182, // 顶点2430, 182, // 顶点3318, 268, // 顶点4360, 400, // 顶点5250, 330, // 顶点6140, 400, // 顶点7182, 268, // 顶点870, 182, // 顶点9206, 182 // 顶点10
];
// 绘制黄色实心五角星
imagefilledpolygon($image, $points, 10, $yellow);
// 输出
header('Content-Type: image/jpeg');
imagejpeg($image);
imagedestroy($image);
?>
代码解析:
创建500x500图像
分配黑色和黄色
填充黑色背景
定义五角星的10个顶点坐标
绘制黄色实心五角星
输出JPEG图像
释放资源
注意事项
适合绘制复杂形状
奇偶填充规则决定重叠区域
顶点顺序影响填充效果
6、imagearc() - 绘制椭圆弧
语法结构
bool imagearc(resource $image, int $cx, int $cy, int $width, int $height, int $start, int $end, int $color
)
参数说明
$image
: 图像资源$cx
: 中心点x坐标$cy
: 中心点y坐标$width
: 椭圆宽度$height
: 椭圆高度$start
: 起始角度(0-360)$end
: 结束角度(0-360)$color
: 弧线颜色索引
返回值
成功返回true,失败返回false。
示例代码及解析
<?php
// 创建400x400图像
$image = imagecreatetruecolor(400, 400);
$white = imagecolorallocate($image, 255, 255, 255);
$colors = [imagecolorallocate($image, 255, 0, 0),imagecolorallocate($image, 0, 255, 0),imagecolorallocate($image, 0, 0, 255)
];
// 填充白色背景
imagefill($image, 0, 0, $white);
// 绘制彩色圆弧(类似饼图)
$start_angle = 0;
foreach ([60, 120, 180] as $i => $angle) {imagearc($image, 200, 200, 300, 300, $start_angle, $start_angle+$angle, $colors[$i]);$start_angle += $angle;
}
// 添加中心点
imagefilledellipse($image, 200, 200, 20, 20, $white);
// 输出
header('Content-Type: image/png');
imagepng($image);
imagedestroy($image);
?>
代码解析:
创建400x400图像
分配白色和红绿蓝三色
填充白色背景
绘制三个相连的彩色圆弧(60°,120°,180°)
在中心添加白色小圆点
输出PNG图像
释放资源
注意事项
角度0表示3点钟方向
顺时针方向绘制
要画完整椭圆可设start=0,end=360
7、imageellipse() - 绘制椭圆
语法结构
bool imageellipse(resource $image, int $cx, int $cy, int $width, int $height, int $color
)
参数说明
$image
: 图像资源$cx
: 中心点x坐标$cy
: 中心点y坐标$width
: 椭圆宽度$height
: 椭圆高度$color
: 边框颜色索引
返回值
成功返回true,失败返回false。
示例代码及解析
<?php
// 创建500x300图像
$image = imagecreatetruecolor(500, 300);
$white = imagecolorallocate($image, 255, 255, 255);
$gray = imagecolorallocate($image, 128, 128, 128);
// 填充白色背景
imagefill($image, 0, 0, $white);
// 绘制同心椭圆
for ($i = 1; $i <= 5; $i++) {$size = $i * 50;imageellipse($image, 250, 150, $size+200, $size, $gray);
}
// 添加文字
imagestring($image, 5, 180, 280, "Ellipse Examples", $gray);
// 输出
header('Content-Type: image/png');
imagepng($image);
imagedestroy($image);
?>
代码解析:
创建500x300图像
分配白色和灰色
填充白色背景
绘制5个同心椭圆(逐渐增大)
添加灰色文字
输出PNG图像
释放资源
注意事项
width=height时为圆形
边框宽度固定为1像素
填充椭圆应使用
imagefilledellipse()
8、imagefilledellipse() - 绘制实心椭圆
语法结构
bool imagefilledellipse(resource $image, int $cx, int $cy, int $width, int $height, int $color
)
参数说明
参数同imageellipse()
返回值
成功返回true,失败返回false。
示例代码及解析
<?php
// 创建400x400图像
$image = imagecreatetruecolor(400, 400);
$black = imagecolorallocate($image, 0, 0, 0);
$colors = [imagecolorallocate($image, 255, 0, 0),imagecolorallocate($image, 0, 255, 0),imagecolorallocate($image, 0, 0, 255)
];
// 填充黑色背景
imagefill($image, 0, 0, $black);
// 绘制奥运五环
$positions = [[100, 100, 80], // 蓝环[200, 100, 80], // 黄环[300, 100, 80], // 黑环[150, 170, 80], // 绿环[250, 170, 80] // 红环
];
foreach ($positions as $i => $pos) {imagefilledellipse($image, $pos[0], $pos[1], $pos[2], $pos[2], $colors[$i % 3]);
}
// 输出
header('Content-Type: image/jpeg');
imagejpeg($image, null, 95);
imagedestroy($image);
?>
代码解析:
创建400x400图像
分配黑色和红绿蓝三色
填充黑色背景
定义五环位置和大小
绘制彩色实心圆环(奥运五环样式)
输出高质量JPEG
释放资源
注意事项
适合绘制气泡、圆点等元素
比绘制多个像素点效率更高
抗锯齿效果需要额外处理
9、imagestring() - 绘制水平文本(内置字体)
语法结构
bool imagestring(resource $image, int $font, int $x, int $y, string $text, int $color
)
参数说明
$image
: 图像资源$font
: 字体编号(1-5对应不同大小)$x
: 文本左上角x坐标$y
: 文本左上角y坐标$text
: 要绘制的文本$color
: 文本颜色索引
内置字体大小
1: 8x13像素
2: 6x13像素
3: 7x13像素(粗体)
4: 8x13像素(更大)
5: 9x15像素
返回值
成功返回true,失败返回false。
示例代码及解析
<?php
// 创建400x200图像
$image = imagecreatetruecolor(400, 200);
$white = imagecolorallocate($image, 255, 255, 255);
$blue = imagecolorallocate($image, 0, 0, 255);
// 填充白色背景
imagefill($image, 0, 0, $white);
// 显示所有内置字体
$text = "Built-in Fonts";
$y = 20; // 起始Y坐标
for ($font = 1; $font <= 5; $font++) {// 使用5种不同的内置字体绘制文本imagestring($image, $font, 50, $y, "$font: $text", $blue);// 计算行高:当前字体高度 + 10像素间距$font_height = imagefontheight($font);$y += $font_height + 10;
}
// 绘制一段多行文本
$lines = ["This is the first line.","Second line with font 3","Third line using font 4"
];
$y = 120; // 新的起始Y坐标
foreach ($lines as $index => $line) {// 交替使用字体3、4、5$font = ($index % 3) + 3;// 绘制文本行imagestring($image, $font, 50, $y, $line, $blue);// 计算行高:当前字体高度 + 5像素间距$font_height = imagefontheight($font);$y += $font_height + 5;
}
// 添加版权信息到右下角
$copyright = "© " . date("Y") . " PHP GD Library";
$font_width = imagefontwidth(2);
$str_width = strlen($copyright) * $font_width;
$x_position = 400 - $str_width - 10; // 右边距10像素
imagestring($image, 2, $x_position, 180, $copyright, $blue);
// 输出PNG图像
header('Content-Type: image/png');
imagepng($image);
// 释放资源
imagedestroy($image);
?>
这个完整示例展示了如何:
使用所有内置字体
创建多行文本
计算文本位置
添加自动版权信息
合理处理行间距
完整代码解析:
图像初始化:
创建400×200像素的真彩色图像资源
分配白色和蓝色颜色资源
填充整个图像背景为白色
字体展示部分:
定义文本内容"Built-in Fonts"
使用循环展示5种内置字体(1-5)
$y
变量控制每行的垂直位置imagefontheight($font)
获取每种字体的高度每行增加字体高度+10像素的间距
多行文本绘制:
定义三行文本内容
交替使用字体3、4、5
foreach
循环逐行绘制每行增加字体高度+5像素的间距
版权信息:
创建包含当前年份的版权文本
imagefontwidth(2)
获取2号字体字符宽度计算文本总宽度:字符数×字符宽度
计算右下角位置:图像宽度-文本宽度-右边距
使用2号字体绘制版权信息
输出与清理:
设置Content-Type为image/png
输出PNG格式图像
销毁图像资源释放内存
注意事项:
内置字体尺寸:
1号:8×13像素
2号:6×13像素
3号:7×13像素(粗体)
4号:8×13像素(更大)
5号:9×15像素
字体尺寸函数:
imagefontheight($font)
:获取字体高度imagefontwidth($font)
:获取字符宽度
文本位置计算:
左上角定位:给定坐标是文本左上角位置
垂直间距:建议使用字体高度+额外间距
水平居中:(图像宽度 - 文本总宽度)/2
局限性:
不支持Unicode字符
字体样式固定
无法旋转文本
性能考虑:
比TrueType字体渲染更快
适合简单标签和低资源环境
多次调用效率高于单次长文本
10、imagestringup() - 绘制垂直文本(内置字体)
语法结构
bool imagestringup(resource $image, int $font, int $x, int $y, string $text, int $color
)
参数说明
$image
: 图像资源$font
: 字体编号(1-5对应不同大小)$x
: 文本左上角x坐标$y
: 文本左上角y坐标$text
: 要绘制的文本$color
: 文本颜色索引
返回值
成功返回true,失败返回false。
示例代码及解析
<?php
// 创建300x300图像
$image = imagecreatetruecolor(300, 300);
$white = imagecolorallocate($image, 255, 255, 255);
$purple = imagecolorallocate($image, 128, 0, 128);
// 填充白色背景
imagefill($image, 0, 0, $white);
// 绘制垂直文本标签
$labels = ['North', 'East', 'South', 'West'];
$positions = [[150, 50], // 北[270, 150], // 东[150, 270], // 南[30, 150] // 西
];
foreach ($positions as $i => $pos) {imagestringup($image, 4, $pos[0], $pos[1], $labels[$i], $purple);
}
// 添加中心点
imagefilledellipse($image, 150, 150, 20, 20, $purple);
// 输出
header('Content-Type: image/png');
imagepng($image);
imagedestroy($image);
?>
代码解析:
创建300x300图像
分配白色和紫色
填充白色背景
定义四个方向的标签位置
使用4号字体绘制垂直文本
在中心添加紫色圆点
输出PNG图像
释放资源
注意事项
文本从上往下垂直排列
适合创建图表标签和特殊效果
字体选择有限,不支持中文
11、imagettftext() - 用TrueType字体绘制文本
语法结构
array imagettftext(resource $image, float $size, float $angle, int $x, int $y, int $color, string $fontfile, string $text
)
参数说明
$image
: 图像资源$size
: 字体大小(磅值)$angle
: 文本角度(0-360度,0为水平)$x
: 文本基线的x坐标$y
: 文本基线的y坐标$color
: 文本颜色索引$fontfile
: TrueType字体文件路径$text
: 要绘制的文本
返回值
返回包含8个元素的数组,表示文本边界框的四个角点坐标。
示例代码及解析
<?php
// 创建600x400图像
$image = imagecreatetruecolor(600, 400);
$white = imagecolorallocate($image, 255, 255, 255);
$black = imagecolorallocate($image, 0, 0, 0);
// 填充白色背景
imagefill($image, 0, 0, $white);
// 设置字体文件路径
$font = 'arial.ttf'; // 确保该字体文件存在
// 绘制各种角度的文本
$texts = [[30, "Welcome to PHP", 100, 100, 0],[24, "旋转的文字", 300, 150, 45],[20, "GD库功能强大", 200, 300, -15],[18, "图像处理示例", 500, 350, 90]
];
foreach ($texts as $item) {list($size, $text, $x, $y, $angle) = $item;imagettftext($image, $size, $angle, $x, $y, $black, $font, $text);
}
// 添加水印
$watermark = imagecolorallocatealpha($image, 128, 128, 128, 60);
imagettftext($image, 14, 0, 20, 390, $watermark, $font, "© 2023 GD Library Demo");
// 输出
header('Content-Type: image/jpeg');
imagejpeg($image, null, 95);
imagedestroy($image);
?>
代码解析:
创建600x400图像
分配白色和黑色
填充白色背景
设置TrueType字体文件
绘制不同大小、位置和角度的文本
添加半透明灰色水印
输出高质量JPEG
释放资源
注意事项
字体文件路径可以是相对或绝对路径
$x
和$y
是基线起点,不是左上角支持UTF-8编码的多语言文本
需要FreeType库支持
12、imagechar() - 绘制单个水平字符
语法结构
bool imagechar(resource $image, int $font, int $x, int $y, string $char, int $color
)
参数说明
$image
: 图像资源$font
: 字体编号(1-5)$x
: 字符左上角x坐标$y
: 字符左上角y坐标$char
: 要绘制的单个字符$color
: 字符颜色索引
返回值
成功返回true,失败返回false。
示例代码及解析
<?php
// 创建400x200图像
$image = imagecreatetruecolor(400, 200);
$gray = imagecolorallocate($image, 200, 200, 200);
$dark_red = imagecolorallocate($image, 128, 0, 0);
// 填充灰色背景
imagefill($image, 0, 0, $gray);
// 绘制ASCII艺术字
$text = "PHP GD";
$char_width = imagefontwidth(5); // 9像素
$char_height = imagefontheight(5); // 15像素
$x_start = (400 - strlen($text) * $char_width) / 2;
$y_start = (200 - $char_height) / 2;
for ($i = 0; $i < strlen($text); $i++) {$x = $x_start + $i * $char_width;imagechar($image, 5, $x, $y_start, $text[$i], $dark_red);
}
// 添加装饰线
imageline($image, $x_start - 10, $y_start + 7, $x_start + strlen($text)*$char_width + 10, $y_start + 7, $dark_red);
// 输出
header('Content-Type: image/png');
imagepng($image);
imagedestroy($image);
?>
代码解析:
创建400x200图像
分配灰色和深红色
填充灰色背景
计算文本居中位置
使用5号字体逐个字符绘制文本
在文本下方添加装饰线
输出PNG图像
释放资源
注意事项
适合创建ASCII艺术效果
只能绘制单个字符
比绘制整个字符串更灵活
13、imagecharup() - 绘制单个垂直字符
语法结构
bool imagecharup(resource $image, int $font, int $x, int $y, string $char, int $color
)
参数说明
参数同imagechar()
返回值
成功返回true,失败返回false。
示例代码及解析
<?php
// 创建300x300图像
$image = imagecreatetruecolor(300, 300);
$light_blue = imagecolorallocate($image, 200, 230, 255);
$navy = imagecolorallocate($image, 0, 0, 128);
// 填充浅蓝色背景
imagefill($image, 0, 0, $light_blue);
// 绘制垂直条形码效果
$chars = '0123456789ABCDEF';
$x = 50;
for ($i = 0; $i < 15; $i++) {$char = $chars[rand(0, strlen($chars)-1)];$y = 50;for ($j = 0; $j < 8; $j++) {imagecharup($image, 3, $x, $y, $char, $navy);$y += imagefontheight(3) + 2;}$x += imagefontwidth(3) + 5;
}
// 添加标题
imagestring($image, 5, 100, 270, "Vertical Barcode", $navy);
// 输出
header('Content-Type: image/jpeg');
imagejpeg($image);
imagedestroy($image);
?>
代码解析:
创建300x300图像
分配浅蓝和深蓝色
填充浅蓝色背景
生成随机字符序列
绘制8个垂直排列的字符组(模拟条形码)
添加水平标题文本
输出JPEG图像
释放资源
注意事项
字符从上往下垂直排列
适合创建特殊视觉效果
比水平字符更节省水平空间
综合比较表:文本绘制函数
函数名 | 字体支持 | 文本方向 | 字符控制 | 适用场景 |
---|---|---|---|---|
imagestring() | 内置字体(1-5) | 水平 | 整个字符串 | 简单标签、快速文本 |
imagestringup() | 内置字体(1-5) | 垂直 | 整个字符串 | 垂直标签、特殊布局 |
imagettftext() | TrueType字体 | 任意角度 | 整个字符串 | 高品质文本、多语言 |
imagechar() | 内置字体(1-5) | 水平 | 单个字符 | ASCII艺术、字符动画 |
imagecharup() | 内置字体(1-5) | 垂直 | 单个字符 | 条形码效果、特殊排版 |
综合比较表:图形绘制函数
函数名 | 填充支持 | 绘制类型 | 复杂度 | 适用场景 |
---|---|---|---|---|
imageline() | 否 | 直线 | 低 | 网格、图表轴线 |
imagerectangle() | 否 | 矩形 | 低 | 边框、框图 |
imagefilledrectangle() | 是 | 矩形 | 低 | 色块、背景 |
imagepolygon() | 否 | 多边形 | 中 | 复杂形状边框 |
imagefilledpolygon() | 是 | 多边形 | 中 | 复杂形状填充 |
imagearc() | 否 | 弧线 | 中 | 饼图、圆弧 |
imageellipse() | 否 | 椭圆 | 中 | 圆形边框 |
imagefilledellipse() | 是 | 椭圆 | 中 | 圆形填充 |
通用注意事项
坐标系统:GD库使用左上角(0,0)坐标系
颜色管理:确保颜色已分配后再使用
资源释放:使用后及时调用
imagedestroy()
字体路径:使用TrueType字体时确保路径正确
内存限制:大图像可能超出内存限制
输出格式:输出前设置正确的Content-Type头
错误处理:检查函数返回值避免静默失败
八、GD库图像处理类函数用法详解(10个)
1、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
)
参数说明
参数 | 类型 | 说明 |
---|---|---|
$dst_im | resource | 目标图像资源 |
$src_im | resource | 源图像资源 |
$dst_x | int | 目标位置的x坐标 |
$dst_y | int | 目标位置的y坐标 |
$src_x | int | 源图像的起始x坐标 |
$src_y | int | 源图像的起始y坐标 |
$src_w | int | 要复制的宽度 |
$src_h | int | 要复制的高度 |
示例代码及解析
<?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格式结果
销毁两个图像资源
注意事项
不执行缩放操作
适合精确区域复制
目标位置可以超出目标图像范围(会被裁剪)
2、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
)
参数说明(新增)
参数 | 类型 | 说明 |
---|---|---|
$dst_w | int | 目标区域的宽度 |
$dst_h | int | 目标区域的高度 |
示例代码及解析
<?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图像
注意事项
使用快速但低质量的算法
会产生锯齿和失真
适合不需要高质量的场景
3、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的区别
特性 | resized | resampled |
---|---|---|
算法 | 快速邻近插值 | 双线性/三次插值 |
质量 | 低,有锯齿 | 高,平滑 |
速度 | 快 | 慢30%-50% |
适用 | 缩略图预览 | 最终输出 |
4、imagescale() - 缩放图像
语法结构
resource|false imagescale(resource $image, int $new_width, int $new_height = -1, int $mode = IMG_BILINEAR_FIXED
)
参数说明
参数 | 类型 | 说明 |
---|---|---|
$image | resource | 源图像 |
$new_width | int | 新宽度 |
$new_height | int | 新高度(-1保持比例) |
$mode | int | 缩放模式常量 |
缩放模式常量
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+版本支持
5、imagecrop() - 裁剪图像
语法结构
resource|false imagecrop(resource $image, array $rect
)
参数说明
参数 | 类型 | 说明 |
---|---|---|
$image | resource | 源图像 |
$rect | array | 裁剪区域数组 |
裁剪区域数组
['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+版本支持
6、imagecropauto() - 自动裁剪
语法结构
resource|false imagecropauto(resource $image, int $mode = IMG_CROP_DEFAULT, float $threshold = 0.5, int $color = -1
)
裁剪模式常量
常量 | 说明 |
---|---|
IMG_CROP_DEFAULT | 同IMG_CROP_TRANSPARENT |
IMG_CROP_TRANSPARENT | 裁剪透明区域 |
IMG_CROP_BLACK | 裁剪黑色区域 |
IMG_CROP_WHITE | 裁剪白色区域 |
IMG_CROP_SIDES | 裁剪四边相同颜色 |
IMG_CROP_THRESHOLD | 使用阈值和指定颜色 |
示例代码及解析
<?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
有效可能需要多次尝试不同模式
7、imagerotate() - 旋转图像
语法结构
resource|false imagerotate(resource $image, float $angle, int $bgd_color, int $ignore_transparent = 0
)
参数说明
参数 | 类型 | 说明 |
---|---|---|
$image | resource | 源图像 |
$angle | float | 旋转角度(0-360) |
$bgd_color | int | 背景填充色 |
$ignore_transparent | int | 是否忽略透明(1忽略) |
示例代码及解析
<?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
8、imageflip() - 翻转图像
语法结构
bool imageflip(resource $image, int $mode
)
翻转模式常量
常量 | 值 | 说明 |
---|---|---|
IMG_FLIP_HORIZONTAL | 1 | 水平翻转 |
IMG_FLIP_VERTICAL | 2 | 垂直翻转 |
IMG_FLIP_BOTH | 3 | 同时水平和垂直翻转 |
示例代码及解析
<?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+版本支持
9、imagefilter() - 应用滤镜
语法结构(完整参数)
bool imagefilter(resource $image, int $filtertype, [int $arg1], [int $arg2], [int $arg3], [int $arg4]
)
参数详解
参数名 | 类型 | 必填 | 说明 |
---|---|---|---|
$image | GdImage|resource | 是 | 由图像创建函数(如imagecreatetruecolor() )返回的图像资源或对象。 |
$filter | int | 是 | 指定滤镜类型的常量(见下方支持的滤镜类型列表)。 |
...$args | mixed | 可选 | 根据滤镜类型需传递的额外参数(如亮度值、RGB颜色等)。 |
支持的滤镜类型常量
常量名称 | 效果描述 | 额外参数说明 |
---|---|---|
IMG_FILTER_NEGATE | 反转图像中所有颜色。 | 无 |
IMG_FILTER_GRAYSCALE | 将图像转换为灰度(基于REC.601亮度计算)。 | 无 |
IMG_FILTER_BRIGHTNESS | 调整亮度,范围-255(全黑)到255(全亮)。 | $arg1 : 亮度值(整数)。 |
IMG_FILTER_CONTRAST | 调整对比度,值越大对比度越高。 | $arg1 : 对比度级别(整数)。 |
IMG_FILTER_COLORIZE | 为图像添加颜色滤镜,类似灰度但可指定颜色。 | $arg1 : 红色分量(0-255);$arg2 : 绿色分量;$arg3 : 蓝色分量;$arg4 : Alpha通道(可选)。 |
IMG_FILTER_EDGEDETECT | 突出图像边缘(边缘检测效果)。 | 无 |
IMG_FILTER_EMBOSS | 浮雕效果。 | 无 |
IMG_FILTER_GAUSSIAN_BLUR | 高斯模糊(平滑处理)。 | 无 |
IMG_FILTER_SELECTIVE_BLUR | 选择性模糊。 | 无 |
IMG_FILTER_MEAN_REMOVAL | 通过平均移除法生成轮廓效果。 | 无 |
IMG_FILTER_SMOOTH | 平滑图像,值越大效果越柔和。 | $arg1 : 平滑级别(整数)。 |
IMG_FILTER_PIXELATE | 像素化效果。 | $arg1 : 像素块大小;$arg2 : 是否启用平滑(布尔值)。 |
完整示例代码
<?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()
检查兼容性
10、imagesavealpha() - 保存PNG图像的Alpha通道
语法结构
bool imagesavealpha(resource $image, bool $enable
)
参数说明
参数 | 类型 | 说明 |
---|---|---|
$image | resource | 图像资源 |
$enable | bool | 是否保存alpha通道(true/false) |
示例代码及解析
<?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库中图像处理类10个函数综合比较表
函数 | 核心功能 | 语法结构 | 性能特点 | 适用场景 | 版本要求 |
---|---|---|---|---|---|
imagecopy() | 区域复制 | imagecopy($dst, $src, $dst_x, $dst_y, $src_x, $src_y, $src_w, $src_h) | ★★★★☆ 无缩放开销 | 精准像素复制 图像局部裁剪 多图层合成 | PHP 4+ |
imagecopyresized() | 缩放复制 (低质量) | imagecopyresized($dst, $src, $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h) | ★★★★★ 快速但锯齿明显 | 缩略图预览 实时图像处理 低配置环境 | PHP 4+ |
imagecopyresampled() | 缩放复制 (高质量) | imagecopyresampled(...) 参数同resized | ★★★☆☆ 平滑但慢30-50% | 高质量缩放 印刷品输出 图像放大处理 | PHP 4+ |
imagescale() | 智能缩放 | imagescale($img, $new_width, [$new_height=-1], [$mode=IMG_BILINEAR_FIXED]) | ★★★★☆ 自动比例保持 | 响应式图片生成 批量尺寸调整 比例约束缩放 | PHP 5.5+ |
imagecrop() | 指定区域裁剪 | imagecrop($img, ['x'=>$x, 'y'=>$y, 'width'=>$w, 'height'=>$h]) | ★★★★☆ 精确控制区域 | 固定比例裁剪 焦点区域提取 图像重构 | PHP 5.5+ |
imagecropauto() | 智能裁剪 | imagecropauto($img, [$mode=IMG_CROP_DEFAULT], [$threshold=0.5], [$color=-1]) | ★★★☆☆ 需多次尝试 | 透明背景清除 证件照白边去除 自动化预处理 | PHP 5.5+ |
imagerotate() | 旋转图像 | imagerotate($img, $angle, $bgd_color, [$ignore_transparent=0]) | ★★★☆☆ 尺寸变化有开销 | 图像矫正 创意旋转效果 水印角度调整 | PHP 4.3+ |
imageflip() | 翻转操作 | imageflip($img, $mode) $mode: IMG_FLIP_* | ★★★★★ 极低资源消耗 | 镜像效果 对称设计 3D贴图处理 | PHP 5.5+ |
imagefilter() | 滤镜应用 | imagefilter($img, $filtertype, [$arg1], [$arg2]...) | ★★☆☆☆ 高斯模糊最耗资源 | 图片特效 色彩校正 艺术化处理 | PHP 5+ |
imagesavealpha() | 透明通道保存 | imagesavealpha($img, $enable) | ★★★★☆ 必需配合alphablending | PNG透明背景 水印叠加 图层合成 | PHP 4.3+ |
关键维度对比说明
质量与性能平衡
优先选
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)。
九、GD库图像输出类函数用法详解(7个)
1、imagepng() - 输出PNG图像
语法结构
bool imagepng(resource $image, [mixed $to = null], [int $quality = -1], [int $filters = -1]
)
参数说明
参数 | 类型 | 说明 |
---|---|---|
$image | resource | 图像资源 |
$to | mixed | 输出路径(字符串)或直接输出(null) |
$quality | int | 压缩级别(0-9),0无压缩 |
$filters | int | PNG过滤器组合(PNG_FILTER_*常量) |
示例代码
<?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
保持透明度
2、imagejpeg() - 输出JPEG图像
语法结构
bool imagejpeg(resource $image, [mixed $to = null], [int $quality = -1]
)
参数说明
参数 | 类型 | 说明 |
---|---|---|
$quality | int | 质量(0-100),默认75 |
示例代码
<?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(渐进式加载)
3、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色索引颜色
4、imagewbmp() - 输出WBMP图像
语法结构
bool imagewbmp(resource $image, [mixed $to = null], [int $foreground = null]
)
参数说明
参数 | 类型 | 说明 |
---|---|---|
$foreground | int | 前景色(默认黑色) |
示例代码
<?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);
?>
应用场景:
移动设备兼容图像
超低带宽传输
单色显示设备
5、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
6、imagegd2() - 输出GD2格式图像
语法结构
bool imagegd2(resource $image, [mixed $to = null], [int $chunk_size = 128], [int $type = IMG_GD2_RAW]
)
参数说明
参数 | 类型 | 说明 |
---|---|---|
$chunk_size | int | 分块大小(像素) |
$type | int | IMG_GD2_RAW 或 IMG_GD2_COMPRESSED |
示例代码
<?php
$img = imagecreatetruecolor(400, 300);
imagegd2($img, 'compressed.gd2', 64, IMG_GD2_COMPRESSED); // 分块压缩
?>
优化建议:
大图像使用分块(如512px)
网络传输用
IMG_GD2_COMPRESSED
7、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+
GD库中图像输出类7个函数综合比较表
函数名称 | 输出格式 | 压缩类型 | 色彩支持 | 透明度支持 | 动画支持 | 典型应用场景 | 质量参数范围 | 浏览器兼容性 |
---|---|---|---|---|---|---|---|---|
imagepng() | PNG | 无损压缩 | 24位真彩色+Alpha通道 | 8位Alpha通道 | ❌ | 网页图形/需要透明的LOGO | 0-9(压缩级) | 所有主流浏览器 |
imagejpeg() | JPEG | 有损压缩 | 24位色(YCbCr色彩空间) | ❌ | ❌ | 照片/需要小文件尺寸的网页图片 | 0-100 | 所有主流浏览器 |
imagegif() | GIF | 无损压缩 | 256色索引色 | 1位布尔透明 | ✔️ | 简单动画/低复杂度图形 | 无 | 所有主流浏览器 |
imagewbmp() | WBMP | 无压缩 | 1位黑白 | ❌ | ❌ | 移动设备/WAP应用 | 无 | 专用设备支持 |
imagegd() | GD | 无压缩 | 取决于创建时的色彩模式 | 取决于源图像 | ❌ | PHP内部图像处理中间态 | 无 | 仅PHP环境可用 |
imagegd2() | GD2 | 分块存储 | 同GD格式 | 同GD格式 | ❌ | 大图像的部分加载处理 | 无 | 仅PHP环境可用 |
imagewebp() | WebP | 有损/无损 | 24位色+Alpha通道 | 8位Alpha通道 | ✔️ | 现代网页应用/高压缩比需求 | 0-100 | Chrome/Firefox/Edge |
关键特性补充说明
压缩效率对比:
- 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+
内存消耗参考:
真彩色图像 > 索引色图像 PNG处理 > JPEG处理 > GIF处理 分块GD2处理可降低大图内存占用
建议根据具体需求选择格式:需要透明选PNG/WebP,照片选JPEG/WebP,动画选GIF/WebP,内部处理选GD/GD2。
十、GD库其他功能类函数用法详解(7个)
1、imagealphablending() - 设置混色模式
语法结构
bool imagealphablending(resource $image, bool $blend_mode
)
参数说明
参数 | 类型 | 说明 |
---|---|---|
$image | resource | 图像资源标识符 |
$blend_mode | bool | true=启用混色(默认),false=禁用 |
示例代码
<?php
// 创建透明画布
$img = imagecreatetruecolor(300, 200);
$transparent = imagecolorallocatealpha($img, 0, 0, 0, 127);
// 情况1:启用混色(默认)
imagealphablending($img, true);
imagefill($img, 0, 0, $transparent); // 实际显示灰色(混合背景)
// 情况2:禁用混色
imagealphablending($img, false);
imagefill($img, 0, 0, $transparent); // 显示完全透明
imagesavealpha($img, true);
imagepng($img, 'output.png');
?>
关键点解析:
第4行:混色模式下,透明色会与默认黑色背景混合
第8行:禁用后才能真正保留alpha通道数据
2、imageantialias() - 启用抗锯齿
语法结构
bool imageantialias(resource $image, bool $enabled
)
示例代码
<?php
$img = imagecreatetruecolor(400, 200);
$white = imagecolorallocate($img, 255, 255, 255);
imagefill($img, 0, 0, $white);
// 无抗锯齿
imageline($img, 50, 50, 350, 50, imagecolorallocate($img, 0, 0, 0));
// 启用抗锯齿
imageantialias($img, true);
imageline($img, 50, 150, 350, 150, imagecolorallocate($img, 0, 0, 0));
imagepng($img);
imagedestroy($img);
?>
效果对比:
第7行:产生锯齿明显的直线
第11行:生成平滑的消锯齿线条
3、imageinterlace() - 设置隔行扫描
语法结构
bool imageinterlace(resource $image, [int $interlace = 0]
)
参数说明
值 | 效果 |
---|---|
0 | 禁用(默认) |
1 | 启用渐进式显示 |
示例代码
<?php
$img = imagecreatefromjpeg('large_photo.jpg');
imageinterlace($img, 1); // 启用渐进式JPEG
imagejpeg($img, 'progressive.jpg', 85);
?>
浏览器表现:
普通JPEG:从上到下逐行加载
渐进式JPEG:先显示模糊全景再逐渐清晰
4、imagesetthickness() - 设置线条宽度
语法结构
bool imagesetthickness(resource $image, int $thickness
)
示例代码
<?php
$img = imagecreatetruecolor(300, 150);
$white = imagecolorallocate($img, 255, 255, 255);
imagefill($img, 0, 0, $white);
imagesetthickness($img, 1);
imagerectangle($img, 50, 30, 250, 70, imagecolorallocate($img, 255, 0, 0));
imagesetthickness($img, 5);
imagerectangle($img, 50, 80, 250, 120, imagecolorallocate($img, 0, 0, 255));
imagepng($img);
?>
注意事项:
仅影响
imageline()
、imagerectangle()
等函数不支持
imagepolygon()
的边线设置
5、imagesetpixel() - 绘制像素点
语法结构
bool imagesetpixel(resource $image, int $x, int $y, int $color
)
示例代码(生成随机噪点)
<?php
$img = imagecreatetruecolor(200, 200);
for ($i = 0; $i < 5000; $i++) {$x = rand(0, 199);$y = rand(0, 199);$color = imagecolorallocate($img, rand(0,255), rand(0,255), rand(0,255));imagesetpixel($img, $x, $y, $color);
}
imagepng($img, 'noise.png');
?>
性能优化:
批量操作建议使用
imagefilledrectangle()
替代真彩色图像每个像素占4字节内存
6、iptcembed() - 嵌入IPTC数据
语法结构
mixed iptcembed(string $iptcdata, string $jpeg_file_name, [int $spool = 0]
)
IPTC标签示例
<?php
$iptc = ["2#120" => "这是图片描述","2#116" => "© 2025 Baidu","2#025" => ["关键词1", "关键词2"]
];
$data = "";
foreach ($iptc as $tag => $value) {$tag_parts = explode('#', $tag);$data .= iptc_maketag($tag_parts[0], $tag_parts[1], $value);
}
$jpg = imagecreatefromjpeg('photo.jpg');
imagejpeg($jpg, 'with_iptc.jpg'); // 必须先保存原始图像
iptcembed($data, 'with_iptc.jpg');
?>
常用标签代码:
2#005
文档标题2#025
关键词2#055
创建日期2#080
作者
7、iptcparse() - 解析IPTC数据
语法结构
array iptcparse(string $iptcblock
)
示例代码
<?php
getimagesize('photo.jpg', $info);
if(isset($info['APP13'])) {$iptc = iptcparse($info['APP13']);echo "作者: ".$iptc['2#080'][0]."\n";print_r($iptc);
}
?>
输出结构:
Array
([2#080] => Array( [0] => "摄影师姓名" )[2#120] => Array( [0] => "图片描述文本" )
)
GD库中其他功能类7个函数综合比较表
函数 | 核心作用 | 常用场景 | 返回值 |
---|---|---|---|
imagealphablending() | 控制alpha通道混合 | 透明图像合成 | bool |
imageantialias() | 图形平滑处理 | 高质量图表绘制 | bool |
imageinterlace() | 渐进式加载设置 | Web优化加载 | bool |
imagesetthickness() | 线条粗细控制 | 工程制图 | bool |
imagesetpixel() | 像素级操作 | 验证码生成 | bool |
iptcembed() | 元数据写入 | 版权管理 | mixed |
iptcparse() | 元数据读取 | 图片信息检索 | array |
建议:
处理透明图像时必须按顺序执行:
imagealphablending($img, false);
// ...绘图操作...
imagesavealpha($img, true);
抗锯齿对以下图形有效:
直线、矩形、椭圆
多边形(需配合
imageantialias()
)