正确入口是 imagecreatetruecolor() 或 imagecreatefromjpeg();GD 库无 gd_create() 函数,文字渲染用 imagettftext() 而非 draw_text(),保存时注意质量参数与透明度设置,资源需手动 imagedestroy() 释放。

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











