ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

PHP 合成图片加文字,把 Codex 的 Base URL 改到 TaoToken 后照 GD 函数排查坐标

PHP 合成图片加文字,把 Codex 的 Base URL 改到 TaoToken 后照 GD 函数排查坐标 1. 活动卡片又歪了imagecopymerge 与 imagettftext 的坐标盲区后台用 PHP 合成图片并加文字的分享卡片又歪了二维码盖住头像。打开 TaoTokenhttps://taotoken.net/?utm_sourcetaotoken_aicg_blog_end建好 Key、把坐标段贴给 Codex 后它第一句就点破问题imagecopymerge 和 imagettftext 的坐标全是写死的。原来那张背景图作者用$width/3.1凑出了“居中”效果换一张图、换一个二维码位置就崩。手动调坐标虽然能修但每换一次素材就要重调一次调完还得反复清缓存看效果很费时间。与其继续改魔数不如直接把这两段坐标逻辑交给 Codex 按实际图片尺寸重算。1.1 两张图三个参数为什么换素材就错位原文里负责合成二维码的核心是这一句imagecopymerge($image_3, $image_2, $x, $y, 0, 0, imagesx($image_2), imagesy($image_2), 100);问题出在$x和$y的来历$x ($width) / 3.1; $y ($height) / 3.1;$width和$height来自getimagesize($path_1)也就是背景图的宽高。真正让人误会的点在于3.1 不是几何规律而是针对某一特定背景图试出来的经验值。背景图换成竖版、横版或者更高清的图之后$x、$y仍然按 1/3.1 的比例下落二维码自然不在原来的视觉位置上。更隐蔽的是这段代码完全没有读取二维码自身的宽高即使$x/$y算对了二维码尺寸变化也会导致右边或底部超出背景图范围。加文字的部分同样有隐患。原文把多行文本拆成了三个数组$content存文字内容$font_lposition存左边距$font_tposition存上边距。每增加一行文字就要同步往三个数组里各塞一个值漏改一个就错位一行。再加上imagettftext的$y参数并不是“文字框顶边”而是字符底部基线很多人把它当“距上边距”用结果文字总是比预期低半个字号。1.2 从“手动调坐标”改成“把坐标计算交给 Codex”常规排障流程是改一下坐标、刷新图片、再改一下、再刷新。这个循环在素材多的时候特别耗时。这次换一种走法把imagecopymerge和imagettftext那几段代码直接贴给 Codex然后告诉它“背景图宽高、二维码宽高、文字行数都会变化请用 getimagesize 的实际宽高重算落点”。Codex 会先确认getimagesize的返回值里有没有二维码尺寸再给出重构方案。这里要澄清一点TaoToken 只负责给 Codex 提供模型 API 通道不执行 PHP 合图也不帮你写文字真正做排障的是接入之后跑起来的 Codex 所调用的模型。2. 给 Codex 换条 API 通道~/.codex/config.toml 指到 TaoToken2.1 先到 TaoToken 拿 Key再改 Codex 的 Base URL打开 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 注册登录在控制台创建一把 API Key复制下来。本文后面所有配置里的 Key 都用YOUR_API_KEY占位请换成刚才复制的那串。模型 ID 不要乱猜回 TaoToken 模型广场复制列表里的实际值。Codex 的配置文件在~/.codex/config.toml。编辑它把模型 provider 指到 TaoTokenmodel 你的模型ID # 从 TaoToken 模型广场复制 model_provider taotoken [model_providers.taotoken] name TaoToken base_url https://taotoken.net/api env_key TAOTOKEN_API_KEY注意base_url填的是接口地址末尾不要加/v1。官网落地页和接口 Base URL 是两回事你打开 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 是注册、创建 Key、看模型广场、看用量https://taotoken.net/api是填进 Codex 的 Base URL。两者不要混用。然后导出环境变量export TAOTOKEN_API_KEYYOUR_API_KEY2.2 先用命令行验证通道再进入 Codex保存配置后可以直接跑一次 Codex 的单轮命令codex exec 这个 PHP 文件里 imagecopymerge 的坐标问题在哪如果 Codex 能正常回答说明 TaoToken 通道已经通了。若提示model not found之类先回模型广场确认模型 ID若提示认证失败检查TAOTOKEN_API_KEY是否设置以及config.toml里env_key和变量名是否一致。终端测试也可以一步到位使用 TaoToken CLInpm install -g taotoken/taotoken taotoken cc -k YOUR_API_KEY -u https://taotoken.net/api -m YOUR_MODEL_ID这条命令直接发一条对话消息能更快定位到底是 Key、Base URL 还是模型 ID 的问题。3. 让 Codex 按 getimagesize 重新计算 imagecopymerge 落点3.1 用真实宽高替代“除以 3.1”把背景图和二维码的尺寸都读出来再算绝对落点。Codex 给的第一版改法通常长这样$bgSize getimagesize($path_1); $qrSize getimagesize($path_2); $x (int)(($bgSize[0] - $qrSize[0]) / 2); $y (int)($bgSize[1] - $qrSize[1] - 60); imagecopymerge($image_3, $image_2, $x, $y, 0, 0, $qrSize[0], $qrSize[1], 100);这段代码里($bgSize[0] - $qrSize[0]) / 2表示二维码在水平方向居中$bgSize[1] - $qrSize[1] - 60表示二维码底线距离图片底部 60 像素。背景图尺寸、二维码尺寸任何一个变化落点都会自动跟着变。如果需求是二维码固定在左下角把第一行改成固定值也行$x 40; $y $bgSize[1] - $qrSize[1] - 80;但重点不是给你一个固定值而是让坐标公式不再依赖“背景图宽度除以 3.1”这种魔法数字。Codex 在解释这段代码时会明确指出$x/$y 应该是目标画布尺寸减去素材尺寸之后的结果而不是背景图尺寸的某个比例。3.2 imagecopymerge 的 $pct 参数与透明背景imagecopymerge最后一个参数是透明度百分比100 表示完全不透明。这里有两个容易踩的坑第一如果二维码 PNG 自带透明圆角imagecopymerge在某些 GD 版本下会把透明区域处理成黑色或白色块第二$pct小于 100 时PNG 的 Alpha 通道会被直接覆盖式混合导致边缘发灰。如果二维码带透明背景改成imagecopy或imagecopyresampled更稳妥imagecopy($image_3, $image_2, $x, $y, 0, 0, $qrSize[0], $qrSize[1]);imagecopy不会做额外透明度计算而是保留源图的 Alpha 通道信息。这个细节是手动调坐标时最容易忽略的位置终于对了但二维码四个圆角外面发黑一圈。把这段现象描述给 Codex它通常会直接建议换成imagecopy并解释两者的混合规则差异。4. imagettftext 的文字基线坑Y坐标不是文字顶部4.1 把“距上边距”改成基线起点原文里给文字定位用了两组数组$font_lposition [10, 10]; $font_tposition [920, 320];imagettftext的$y参数代表基线位置也就是字符底部参考线不是文字框的顶边。直接把数组当“距上边距”用视觉上会偏下。更准确的做法是设定第一行的基线起点然后按行高递增$fontSize 25; $lineHeight (int)($fontSize * 1.6); $marginLeft 40; $baselineY 900; foreach ($content as $i $line) { imagettftext($bg_image, $fontSize, 0, $marginLeft, $baselineY $i * $lineHeight, $textColor, $font, $line); }行高用字号的 1.5 到 1.6 倍中文才不会上下贴行。如果你原来在两行文字之间留了 30 像素改成行高公式后换字体也不会突然叠字。另一个值得注意的点是原文imagettftext里直接传入了颜色索引21这是调色板颜色索引在真彩色画布上容易出现意外的颜色建议改成$textColor imagecolorallocate($bg_image, 51, 51, 51);4.2 用 imagettfbbox 防止文字顶到图片边缘分享卡片最容易翻车的场景是文字太长。imagettftext不会自动换行也不会自动缩字号字多就直接画出图片边界。可以在写入前用imagettfbbox测量这一行文字的宽度$bbox imagettfbbox($fontSize, 0, $font, $line); $textWidth abs($bbox[2] - $bbox[0]); if ($textWidth $bgWidth - 2 * $marginLeft) { $fontSize (int)($fontSize * 0.9); }这样文字最长不会顶到图片右边缘。测量结果也可以用于计算居中($bgWidth - $textWidth) / 2就是这一行文字的水平起点。Codex 在排查这类问题时经常直接输出这段逻辑你只需要把当前字体文件路径、背景图宽度和文字内容传给它。5. 保存输出前还差两步验证5.1 远程图片读取与画布保存原文用getimagesize($bgimg)拿到类型后拼接imagecreatefromjpeg等函数但外链图片的 URL 如果带压缩参数或者重定向getimagesize拿到的类型可能和实际内容不一致。更通用的读图方式是用imagecreatefromstring$bgData file_get_contents($bgimg); $bg_image imagecreatefromstring($bgData); if ($bg_image false) { // 在这里处理读取失败而不是继续合成 }保存时也要注意图片类型。背景图如果是 PNG用imagejpeg($image_3, ./new.jpg)会直接丢失透明通道并且可能把透明部分填充成黑色。常见做法是统一输出 JPG 前先用白色填充画布或者输出 PNG 保留透明度imagepng($image_3, ./new.png);如果业务要求必须输出 JPG可以在创建画布后先用白色填充$image_3 imagecreatetruecolor($bgSize[0], $bgSize[1]); $white imagecolorallocate($image_3, 255, 255, 255); imagefill($image_3, 0, 0, $white);5.2 用刚配好的 Key 去控制台核对这次调用代码改完重新生成分享图确认二维码位置和文字没有再错位。如果想让这次排障过程留个底回到 TaoToken 控制台的用量页面能看到刚才 Codex 调用的模型、时间和 token 数。控制台入口仍然是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 创建的 Key 在 API Keys 页面 统一管理。若你接下来会频繁把 PHP 报错贴给模型看可以在 模型对话 先用同一把 Key 验证一下模型返回速度需要按量长期写代码就直接打开 Coding Plan 看套餐。Codex 的 Base URL 保持https://taotoken.net/api不要动后续如果再遇到坐标错位问题只会出在模型 ID 或 Key 的配置上。
返回列表