正确入口是 imagecreatetruecolor() 或 imagecreatefromjpeg();GD 库无 gd_create() 函数,文字渲染用 imagettftext() 而非 draw_text(),保存时注意质量参数与透明度设置,资源需手动 imagedestroy() 释放。
gd_create() 不存在,正确入口是
或
PHP 的 GD 库没有
这个函数——这是初学者常搜错的关键词,直接导致查不到文档或报
。真正创建图像资源的起点分两类:
(新建空白图)和
系列(从文件加载)。前者返回一个真彩色画布,后者根据扩展名选对应函数:
、
、
(PHP 8.1+)等。
注意:
是调色板模式(256 色),不支持透明度混合和高质量缩放,生产环境务必优先用
;加载 PNG 时还要手动启用 alpha 通道:
,否则透明背景会变黑。
draw_text() 不是 GD 函数,文字渲染靠
和字体路径
GD 没有封装好的
,所有文字绘制必须用
(需开启 FreeType 支持)。它参数多、坐标反直觉:y 坐标是文字基线位置,不是左上角,所以
可能只显示半截字。常见错误包括:
未检查
和
是否启用(Linux 下可能叫
包)
传入相对路径字体文件(如
),实际需绝对路径:
忽略字符编码:中文字符串必须是 UTF-8,且字体本身要包含对应字形,否则显示方块或空格
未分配文字颜色资源:
后才能传入
示例关键行:
立即学习
“
PHP免费学习笔记(深入)
”;
保存图片时
和
的质量与透明度控制
输出格式决定函数选择,但参数细节极易踩坑:
PHP 8.5.5
PHP 8.5.5 是 PHP 8.5 分支的维护更新版本。该版本延续了“小步快跑”的迭代逻辑,通过深度错误修复、底层性能微调以及安全加固,旨在为开发者提供一个更健壮、更高效的运行环境。该版本严格遵守语义化版本规范,不包含破坏性变更。
下载
:第二个参数为
表示直接输出到浏览器,第三个参数是质量(1–100),省略则默认 75;若写成
则保存到文件
:PNG 不用“质量”,而是压缩级别(0–9),0 最快最差,9 最慢最好;但更重要的是透明度——必须在创建后、绘图前调用
和
,否则 PNG 透明区域全变黑色
输出前务必清除输出缓冲:
,否则 header 已发送或有空格会导致 “Cannot modify header information” 错误
常见错误信息:
,基本都是 echo、空格或 BOM 头导致。
内存不足和超时:GD 图像资源不释放会 OOM
GD 创建的图像资源(如
)不会自动回收,尤其循环处理多张图时,
必须显式调用。否则每张 1000×1000 的真彩色图占约 4MB 内存,10 张就 40MB,超出
直接崩溃。
典型漏写场景:
异常分支没销毁资源(如
后忘了
)
缩略图生成中先
,再
,最后只销毁了目标图,源图泄露
用
缩放后,两个资源都得
建议模式:
(PHP 7.5+ 支持,旧版手动配对)。
GD 的麻烦不在语法,而在每个环节都有隐性依赖:编译选项、字体文件、内存策略、输出时机。少设一个
,少清一次 buffer,少毁一个资源,问题就卡在看似无关的地方。
imagecreatetruecolor()imagecreatefromjpeg()gd_create()Call to undefined function gd_create()imagecreatetruecolor()imagecreatefromxxx()imagecreatefromjpeg()imagecreatefrompng()imagecreatefromwebp()imagecreate()imagecreatetruecolor()imagesavealpha($img, true)imagettftext()draw_text()imagettftext()100extension=gdextension=freetypephp-gd"./font.ttf"__DIR__ . '/font.ttf'$color = imagecolorallocate($img, 0, 0, 0)imagettftext()imagettftext($img, 16, 0, 20, 40, $color, __DIR__.'/simhei.ttf', '你好');imagejpeg()imagepng()imagejpeg($img, null, 95)nullimagejpeg($img, 'out.jpg', 95)imagepng($img, null, 9)imagealphablending($img, false)imagesavealpha($img, true)ob_end_clean()Warning: Cannot modify header information - headers already sent$imgimagedestroy($img)memory_limitif (!$img) { return; }imagedestroy()imagecreatefromjpeg()imagecreatetruecolor()imagecopyresampled()imagedestroy()try { /* 处理 */ } finally { imagedestroy($src); imagedestroy($dst); }imagesavealpha()