You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

PHP imagettftext函数无法生效,自定义字体生成图片失败求助

解决imagettftext无法输出内容的问题

我来帮你排查下这个问题,imagettftext不显示内容但imagestring正常工作,通常有几个常见的原因,咱们逐一分析解决:

1. 字体路径不准确

虽然你说font.ttf和脚本在同一目录,但PHP的工作目录不一定是脚本所在的目录(比如通过Web服务器运行时,工作目录可能是服务器根目录,而非脚本所在的子目录)。

解决办法:使用绝对路径指定字体文件,用__DIR__(当前脚本所在的绝对目录)来拼接路径,确保PHP能找到字体:

$font = __DIR__ . '/font.ttf';

2. 文字坐标超出可见区域

imagettftexty参数是字体的基线位置(不是文字顶部),你设置的y=15加上10号字体的高度,可能刚好把文字画到了图片顶部之外,导致看不到。

调整y坐标到更合适的位置,比如30:

imagettftext($image, 10, 0, 15, 30, $textcolor, $font, 'Test TTF');

3. 字体文件本身有问题

有些TTF文件可能损坏、格式不兼容,或者扩展名是.ttf但实际并非TrueType字体。你可以换一个确认可用的TTF字体测试(比如系统自带的Arial、Roboto等),或者重新下载当前字体文件。

4. 错误抑制符掩盖了问题

你用@imagecreate(400, 110);@会抑制所有错误信息,万一imagecreateimagettftext抛出了错误(比如GD库缺少FreeType支持),你也看不到。

建议去掉@,开启错误提示,方便排查潜在问题:

// 去掉@符号
$image = imagecreate(400, 110);

5. 文件权限问题

确保Web服务器的运行用户(比如www-dataapache)有读取font.ttf文件的权限,你可以把字体文件权限设置为644(可读):

chmod 644 font.ttf

修改后的示例代码

结合上面的优化点,代码可以改成这样:

header('Content-Type: image/png');
// 去掉错误抑制,方便排查
$image = imagecreate(400, 110);
$background = imagecolorallocate($image, 70, 130, 180);
$textcolor = imagecolorallocate($image, 255, 255, 255);
// 使用绝对路径确保找到字体
$font = __DIR__ . '/font.ttf'; 
// 调整y坐标到可见区域
imagettftext($image, 10, 0, 15, 30, $textcolor, $font, 'Test TTF');
imagestring($image, 2, 15, 50, 'Test Normal Font', $textcolor);
imagepng($image, 'images/test.png');
imagedestroy($image);

内容的提问来源于stack exchange,提问作者Lee Cheung

火山引擎 最新活动