ThinkPHP的fontSize参数仅在调用entry()前通过配置数组生效,且仅对TTF字体有效;默认25,设30~40可明显变大,但需同步调整imageW/imageH防截断,useZh为true时控制单字高度,而SVG输出下该参数无效。

直接改 fontSize 参数就行,但得看你是用原生 GD 还是 ThinkPHP 类库 —— 两者生效逻辑完全不同,硬套会失效。
ThinkPHP 的 fontSize 配置怎么起作用
ThinkPHP 的验证码类(\think\captcha\Captcha)把字体大小封装进配置数组,它只在调用 entry() 前生效,且仅对 TTF 字体有效。
-
fontSize默认是25,设成30或40能明显变大,但超过50容易撑出画布 - 必须配合
imageW和imageH调整画布尺寸,否则文字被截断 —— 比如fontSize => 36至少配imageH => 70 - 如果没指定
fontttf,系统会随机选一个字体,某些字体即使fontSize很大,实际渲染高度也可能偏小(比如某些无衬线 TTF 在 GD 中 baseline 计算异常) - 中文验证码要额外注意:
useZh => true时,fontSize控制的是单字高度,但中文字形本身比英文占空间,建议同步增大length间隔或手动改config/captcha.php中的offsetX等微调参数
原生 GD 里 imagestring 的字号为什么改不动
因为 imagestring($im, 5, ...) 的第二个参数只能是 1–5 的整数,它对应 GD 内置位图字体,不是像素值 —— 改成 5 是最大,但也就约 16×16 像素,再大就模糊失真。
- 想真正控制像素级大小,必须换用
imagettftext,第一个参数才是真实字号(单位 px) -
imagettftext需要传入字体文件路径,常见错误是路径错或权限不足,导致回退到内置字体,看着像“没生效” - y 坐标不是文字底部而是基线位置,设成
30不代表文字顶部在 y=30,实际要加字体 ascent 才能居中,常用经验是y = $height * 0.7 - 别忘了用
imagecreatetruecolor创建真彩色画布,imagecreate的调色板模式下 TTF 渲染可能全黑或色块异常
为什么调大了还是看不清、发虚、边缘锯齿
这不是字号问题,是渲染链路里的隐性限制点。
立即学习“PHP免费学习笔记(深入)”;
- GD 库编译时若没启用 freetype 支持,
imagettftext会静默失败,返回黑块或空白 —— 用var_dump(gd_info())确认"FreeType Support" => true - 字体文件本身质量差(比如缩放拉伸过的 .ttf),或用了等宽位图字体(如
fixed.ttf),放大后就是马赛克 - 没关抗锯齿:
imageantialias($im, true)要在绘图前调用,否则大字号边缘全是阶梯状锯齿 - 输出格式影响观感:PNG 保留 alpha,JPEG 有压缩损,同一张图在不同浏览器缩放渲染效果可能不一致 —— 前端用 CSS
image-rendering: -webkit-optimize-contrast可缓解
最常被忽略的是:ThinkPHP 的 fontSize 对 SVG 输出无效,entry('svg') 走的是另一套 DOM 渲染逻辑,字号由 <text font-size="..."> 控制,得重写 Captcha::buildSvg() 方法。



















