GD库需实测而非仅查phpinfo():先用extension_loaded('gd')确认加载,再测imagecreatefrompng、imagettftext及gd_info()['FreeType Support'];画布须分配颜色、填充背景、正确设置透明;中文需绝对路径字体、启用mbstring、选中文字体;输出前header必须匹配imagepng等函数,且避免输出干扰。

GD 库不是靠“学完函数列表”就能用好的,它是一套需要边画边调的图像操作逻辑。没配好环境、颜色分配顺序错、中文路径写错、header 发送晚了——任何一个环节卡住,图像就黑屏或报错。
怎么确认 GD 库真能用
别只看 phpinfo() 里有 gd 就以为万事大吉。必须实测加载和输出能力:
- 运行
extension_loaded('gd'),返回true才算加载成功 - 检查关键格式支持:
function_exists('imagecreatefrompng')、function_exists('imagettftext'),尤其后者决定你能不能画中文 - 执行
var_dump(gd_info()['FreeType Support']),false表示 .ttf 字体功能不可用,imagettftext()会直接警告 - Linux 下常见坑是安装了
php-gd但没装系统级依赖,比如 CentOS 缺freetype-devel,Ubuntu 缺libfreetype6-dev
imagecreatetruecolor() 后必须做这三件事
创建画布只是起点,漏掉任意一步,图像就无法正常显示或颜色错乱:
- 先调
imagecolorallocate()分配颜色,再用这个返回值去绘图;不能跳过分配直接传 RGB 数组 - 真彩色画布必须手动填充背景,用
imagefill($img, 0, 0, $color)或imagefilledrectangle(),否则默认是黑色且不可控 - 如果要透明背景(比如生成带 alpha 的 PNG),必须在填充前加两行:
imagesavealpha($img, true)和imagealphablending($img, false);顺序反了或漏一行,透明区域就会变黑或灰
中文文字画不出来?90% 是这三个地方错了
imagettftext() 不报错但显示方块/空格/乱码,基本锁定以下问题:
立即学习“PHP免费学习笔记(深入)”;
- 字体文件路径写错:
imagettftext()第七个参数是绝对路径,./simhei.ttf这种相对路径在 CLI 或 Web 环境下行为不一致,建议用__DIR__ . '/simhei.ttf' - PHP 没启用
mbstring扩展,导致 UTF-8 中文传入时被截断;用mb_internal_encoding('UTF-8')强制编码,比用iconv()更稳妥 - 字体文件本身不支持中文,比如用 Arial.ttf 写中文肯定失败;Windows 下可用
simhei.ttf,Linux 常用DejaVuSans.ttf或WenQuanYiZenHei.ttf
输出图像前 header() 必须严格匹配
浏览器看到空白或下载弹窗,大概率是 MIME 类型和输出函数不配套:
-
header('Content-Type: image/png')→ 必须配imagepng($img);配imagejpeg()会输出乱码 -
header('Content-Type: image/jpeg')→ 必须配imagejpeg($img, null, 85);第三个参数是质量,不传默认 75,但 null 不能省略 - 任何
echo、print、空白符、BOM 头出现在header()之前,都会导致 “headers already sent” 错误;用ob_start()包裹整个脚本是最保险的兜底方式
GD 最难的不是函数记不住,而是每一步都依赖前一步的状态:资源是否有效、颜色是否已分配、alpha 是否已开启、header 是否已发送。一个 imagedestroy() 放错位置,后续再调用图像函数就直接 fatal error。动手前先跑通一个最小闭环:imagecreatetruecolor → imagecolorallocate → imagefill → header + imagepng → imagedestroy,再往里加文字、线条、缩放,节奏就稳了。



















