You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP GD库图片水印:如何替换imagestring使用自定义字体?

如何在PHP GD中使用自定义字体添加水印

你说得对,imagestring()确实只能用GD内置的那几种有限字体,没法用自定义的TrueType字体。要实现自定义字体水印,咱们得换成imagettftext()函数——这个函数专门用来渲染TrueType/OpenType字体,完全能满足你的需求。

下面一步步给你修改代码,同时解释关键变化:

关键修改点

  • 替换imagestring()为imagettftext(),传入自定义字体文件路径
  • 调整文本坐标(因为imagettftext()的Y轴是文字基线位置,不是左上角)
  • 用imagecolorallocate()正确定义字体颜色(避免直接十六进制可能的兼容问题)
  • 确保字体文件路径正确(比如把arial.ttf放在项目根目录,或者用绝对路径)

修改后的完整代码

<?php 
$file = fopen("inputfile.txt", "r"); 
$i = 0; 
$line_of_text = ''; // 初始化变量,避免未定义警告
while (!feof($file)) { 
    $line_of_text .= fgets($file); 
} 
$myText = explode("\n", $line_of_text); 
// 过滤掉空行(比如文件末尾的换行)
$myText = array_filter($myText, function($line) {
    return trim($line) !== '';
});
fclose($file); 

$arrayCount = count($myText); 
// 自定义字体路径,这里假设arial.ttf在项目根目录
$fontPath = 'arial.ttf'; 
// 字体大小
$fontSize = 16; 

for ($x = 0; $x < $arrayCount; $x++) { 
    $image = imagecreatefromjpeg('flower.jpg'); 
    // 创建水印图章
    $stamp = imagecreatetruecolor(200, 70); 
    // 透明背景(如果需要的话,这里保留原来的蓝色底)
    imagefilledrectangle($stamp, 0, 0, 199, 69, 0x0000FF); 
    imagefilledrectangle($stamp, 9, 9, 190, 60, 0xFFFFFF); 

    // 定义字体颜色(蓝色)
    $fontColor = imagecolorallocate($stamp, 0, 0, 255);

    // 替换imagestring为imagettftext,添加分类名称
    // 参数说明:资源、字体大小、角度、X坐标、Y坐标、颜色、字体路径、文本
    imagettftext($stamp, $fontSize, 0, 20, 35, $fontColor, $fontPath, $myText[$x]); 
    // 添加版权文字
    imagettftext($stamp, $fontSize-4, 0, 20, 55, $fontColor, $fontPath, '(c) 2017'); 

    // 设置水印位置
    $right = 250; 
    $bottom = 250; 
    $sx = imagesx($stamp); 
    $sy = imagesy($stamp); 

    // 合并水印到原图,透明度40%
    imagecopymerge($image, $stamp, imagesx($image) - $sx - $right, imagesy($image) - $sy - $bottom, 0, 0, $sx, $sy, 40); 

    // 保存图片并释放资源
    imagepng($image, 'flower_stamp-'.$x.'.png'); 
    imagedestroy($image); 
    imagedestroy($stamp); // 别忘了释放stamp资源
} 
?>

注意事项

  1. 字体路径:确保arial.ttf确实在你指定的路径下,如果找不到字体,GD会报错。可以用绝对路径比如/var/www/html/fonts/arial.ttf来避免路径问题。
  2. GD库支持:确保你的PHP GD库已经启用了FreeType支持,可以通过phpinfo()查看GD部分的配置,确认--with-freetype-dir存在。
  3. 文本坐标调整:imagettftext()的Y坐标是文字的基线位置,不是左上角,所以如果文字被切掉,稍微调大Y值就行。
  4. 空行过滤:我加了array_filter来过滤inputfile.txt里的空行(比如文件末尾的换行),避免生成不必要的水印图片。

这样修改后,你的水印就能用自定义字体渲染了,效果会比内置字体美观很多。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:24:42