什么是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数据到JPEG

iptcparse() - 解析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映射的日文字体(布尔值)

示例代码及解析

// 获取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格式

返回值

返回一个整数,表示支持的图像类型的位掩码组合。

示例代码及解析

// 获取支持的图像类型

$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的标签

图像的MIME类型

颜色通道数(3表示RGB, 4表示RGBA)

位深度(每像素位数)

图像类型常量

IMAGETYPE_GIF

IMAGETYPE_JPEG

IMAGETYPE_PNG

IMAGETYPE_SWF

IMAGETYPE_PSD

IMAGETYPE_BMP

IMAGETYPE_WBMP

IMAGETYPE_XBM

IMAGETYPE_WEBP

示例代码及解析

// 获取图像信息

$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。

示例代码及解析

// 创建图像资源

$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。

示例代码及解析

// 从文件创建图像资源

$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位)

示例代码及解析

// 创建真彩色图像

$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。

示例代码及解析

// 创建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。

示例代码及解析

// 创建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。

示例代码及解析

// 从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。

示例代码及解析

// 从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。

示例代码及解析

// 从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。

示例代码及解析

// 从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。

示例代码及解析

// 从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);

// 输出高质量JPEG

header('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。

示例代码及解析

// 从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。

示例代码及解析

// 从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。

示例代码及解析

// 从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。

示例代码及解析

// 从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系统图标

示例代码及解析

// 检查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更小的文件大小

示例代码及解析

// 从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。

示例代码及解析

// 创建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。

示例代码及解析

// 创建透明背景图像

$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。

示例代码及解析

// 创建图像

$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。

示例代码及解析

// 创建调色板图像

$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坐标

返回值

返回像素点的颜色索引值。

示例代码及解析

// 创建渐变图像

$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)

示例代码及解析

// 创建图像并分配颜色

$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)

返回值

无返回值。

示例代码及解析

// 创建调色板图像

$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。

示例代码及解析

// 创建调色板图像

$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。

示例代码及解析

// 创建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。

示例代码及解析

// 创建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。

示例代码及解析

// 创建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。

示例代码及解析

// 创建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, // 顶点1

350, 150, // 顶点2

300, 350, // 顶点3

100, 350, // 顶点4

50, 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。

示例代码及解析

// 创建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, // 顶点1

294, 182, // 顶点2

430, 182, // 顶点3

318, 268, // 顶点4

360, 400, // 顶点5

250, 330, // 顶点6

140, 400, // 顶点7

182, 268, // 顶点8

70, 182, // 顶点9

206, 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。

示例代码及解析

// 创建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。

示例代码及解析

// 创建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。

示例代码及解析

// 创建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。

示例代码及解析

// 创建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。

示例代码及解析

// 创建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个元素的数组,表示文本边界框的四个角点坐标。

示例代码及解析

// 创建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。

示例代码及解析

// 创建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。

示例代码及解析

// 创建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_imresource目标图像资源$src_imresource源图像资源$dst_xint目标位置的x坐标$dst_yint目标位置的y坐标$src_xint源图像的起始x坐标$src_yint源图像的起始y坐标$src_wint要复制的宽度$src_hint要复制的高度

示例代码及解析

// 创建目标图像(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_wint目标区域的宽度$dst_hint目标区域的高度

示例代码及解析

// 创建目标图像(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。

函数功能是将源图像的一部分复制到目标图像,并进行重新采样处理,特别适合用于生成缩略图等需要改变图像尺寸的场景。

示例代码及解析

// 创建高精度目标图像(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的区别

特性resizedresampled算法快速邻近插值双线性/三次插值质量低,有锯齿高,平滑速度快慢30%-50%适用缩略图预览最终输出

4、imagescale() - 缩放图像

语法结构

resource|false imagescale(

resource $image,

int $new_width,

int $new_height = -1,

int $mode = IMG_BILINEAR_FIXED

)

参数说明

参数类型说明$imageresource源图像$new_widthint新宽度$new_heightint新高度(-1保持比例)$modeint缩放模式常量

缩放模式常量

IMG_NEAREST_NEIGHBOUR: 最近邻插值

IMG_BILINEAR_FIXED: 双线性插值

IMG_BICUBIC: 双三次插值

IMG_BICUBIC_FIXED: 快速双三次近似

示例代码及解析

// 加载原始图像

$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

)

参数说明

参数类型说明$imageresource源图像$rectarray裁剪区域数组

裁剪区域数组

[

'x' => int, // 起点x

'y' => int, // 起点y

'width' => int, // 宽度

'height' => int // 高度

]

示例代码及解析

// 加载全景图

$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_TRANSPARENTIMG_CROP_TRANSPARENT裁剪透明区域IMG_CROP_BLACK裁剪黑色区域IMG_CROP_WHITE裁剪白色区域IMG_CROP_SIDES裁剪四边相同颜色IMG_CROP_THRESHOLD使用阈值和指定颜色

示例代码及解析

// 创建带透明背景的图像

$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

)

参数说明

参数类型说明$imageresource源图像$anglefloat旋转角度(0-360)$bgd_colorint背景填充色$ignore_transparentint是否忽略透明(1忽略)

示例代码及解析

// 加载图像

$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_HORIZONTAL1水平翻转IMG_FLIP_VERTICAL2垂直翻转IMG_FLIP_BOTH3同时水平和垂直翻转

示例代码及解析

// 加载不对称图像

$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]

)

参数详解

参数名类型必填说明$imageGdImage|resource是由图像创建函数(如imagecreatetruecolor())返回的图像资源或对象。$filterint是指定滤镜类型的常量(见下方支持的滤镜类型列表)。...$argsmixed可选根据滤镜类型需传递的额外参数(如亮度值、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: 是否启用平滑(布尔值)。

完整示例代码

// 加载原始图像

$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

)

参数说明

参数类型说明$imageresource图像资源$enablebool是否保存alpha通道(true/false)

示例代码及解析

// 创建透明画布

$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)★★★★☆

必需配合alphablendingPNG透明背景

水印叠加

图层合成PHP 4.3+

关键维度对比说明

‌质量与性能平衡‌

优先选imagecopyresampled处理最终输出(高质量)1

临时预览用imagecopyresized(速度快)1

‌自动化能力‌

imagecropauto可智能去背景(如证件照白边消除)3

imagescale保持比例无需计算高度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]

)

参数说明

参数类型说明$imageresource图像资源$tomixed输出路径(字符串)或直接输出(null)$qualityint压缩级别(0-9),0无压缩$filtersintPNG过滤器组合(PNG_FILTER_*常量)

示例代码

// 创建透明画布

$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]

)

参数说明

参数类型说明$qualityint质量(0-100),默认75

示例代码

$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]

)

示例代码

// 创建动画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]

)

参数说明

参数类型说明$foregroundint前景色(默认黑色)

示例代码

$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]

)

示例代码

$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_sizeint分块大小(像素)$typeintIMG_GD2_RAW 或 IMG_GD2_COMPRESSED

示例代码

$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]

)

示例代码

$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通道❌网页图形/需要透明的LOGO0-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-100Chrome/Firefox/Edge

关键特性补充说明

‌压缩效率对比‌:

WebP > JPEG ≈ PNG > GIF > GD/GD2 > WBMPWebP相比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

)

参数说明

参数类型说明$imageresource图像资源标识符$blend_modebooltrue=启用混色(默认),false=禁用

示例代码

// 创建透明画布

$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

)

示例代码

$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启用渐进式显示

示例代码

$img = imagecreatefromjpeg('large_photo.jpg');

imageinterlace($img, 1); // 启用渐进式JPEG

imagejpeg($img, 'progressive.jpg', 85);

?>

‌浏览器表现‌:

普通JPEG:从上到下逐行加载

渐进式JPEG:先显示模糊全景再逐渐清晰

4、imagesetthickness() - 设置线条宽度

语法结构

bool imagesetthickness(

resource $image,

int $thickness

)

示例代码

$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

)

示例代码(生成随机噪点)

$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标签示例

$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

)

示例代码

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通道混合透明图像合成boolimageantialias()图形平滑处理高质量图表绘制boolimageinterlace()渐进式加载设置Web优化加载boolimagesetthickness()线条粗细控制工程制图boolimagesetpixel()像素级操作验证码生成booliptcembed()元数据写入版权管理mixediptcparse()元数据读取图片信息检索array

‌建议‌:

处理透明图像时必须按顺序执行:

imagealphablending($img, false);

// ...绘图操作...

imagesavealpha($img, true);

抗锯齿对以下图形有效:

直线、矩形、椭圆

多边形(需配合imageantialias())

IPTC数据最大限制为65535字节


TOP