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资源 } ?>
注意事项
- 字体路径:确保
arial.ttf确实在你指定的路径下,如果找不到字体,GD会报错。可以用绝对路径比如/var/www/html/fonts/arial.ttf来避免路径问题。 - GD库支持:确保你的PHP GD库已经启用了FreeType支持,可以通过
phpinfo()查看GD部分的配置,确认--with-freetype-dir存在。 - 文本坐标调整:
imagettftext()的Y坐标是文字的基线位置,不是左上角,所以如果文字被切掉,稍微调大Y值就行。 - 空行过滤:我加了
array_filter来过滤inputfile.txt里的空行(比如文件末尾的换行),避免生成不必要的水印图片。
这样修改后,你的水印就能用自定义字体渲染了,效果会比内置字体美观很多。
内容的提问来源于stack exchange,提问作者Sarah
相关产品推荐
相关产品推荐

