如何在ImageMagick中将图片与文本组居中于1400x500画布?
问题描述
我当前正在生成左侧为图片、右侧为文本的横幅,目前效果正常但定位操作繁琐。希望将
$robot_image与$robot_name文本合并为图像组,再将该组居中放置在1400x500尺寸的背景画布上,目标为机器人图片+文本作为整体居中于画布(附效果图)。当前使用代码如下:$banner = exec("convert {$robot_image} -resize 500x500 -gravity west -geometry +100+100 -background '#{$hex}' -extent 1400x500 -font 'SignPainter.ttc' -pointsize 300 -fill 'white' -strokewidth 20 -fill white \ -stroke 'rgba(0,0,0,0.3)' -annotate +550+40 '{$robot_name}' \ -stroke none -annotate +550+40 '{$robot_name}' output.jpg");
解决方案
核心思路是先把机器人图片和文本合成一个独立的组合图层,再将这个图层直接居中放到目标背景画布上,无需手动计算定位偏移量。
方法一:分步处理(使用临时文件)
# 生成包含机器人图片和文本的组合图层 exec("convert {$robot_image} -resize 500x500 \ -font 'SignPainter.ttc' -pointsize 300 -fill 'white' \ -strokewidth 20 -stroke 'rgba(0,0,0,0.3)' -annotate +550+40 '{$robot_name}' \ -stroke none -annotate +550+40 '{$robot_name}' temp_composite.png"); # 将组合图层居中合成到1400x500的背景画布 $banner = exec("convert -size 1400x500 xc:'#{$hex}' temp_composite.png -gravity center -composite output.jpg"); # 可选:清理临时文件 unlink('temp_composite.png');
方法二:单条命令直接处理(无临时文件)
$banner = exec("convert -size 1400x500 xc:'#{$hex}' \ \( {$robot_image} -resize 500x500 \ -font 'SignPainter.ttc' -pointsize 300 -fill 'white' \ -strokewidth 20 -stroke 'rgba(0,0,0,0.3)' -annotate +550+40 '{$robot_name}' \ -stroke none -annotate +550+40 '{$robot_name}' \) \ -gravity center -composite output.jpg");
关键说明
- 用括号
()包裹图片缩放和文本标注的操作,让它们形成一个独立的图层单元 - 先创建指定尺寸和背景色的空白画布(
xc:'#{$hex}') - 通过
-gravity center -composite参数,自动将组合图层居中放置在背景画布上,彻底省去手动调整+X+Y定位坐标的繁琐操作
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

