创建一个带有随机放置在中心周围的字符串的图像

create an image with a string randomly placed around the center

我正在尝试创建一组非常简单的图像,只是白色背景上的一个字符串。

我希望字符串位于图像中的随机位置,围绕中心,以便整个字符串可见(即 none 隐藏在图像限制之外)。

字符串是自动生成的,所以我事先不知道它们的长度,我只知道它们会在给定的长度范围内(6 - 15 个字符)。

为此,我正在使用 imagemagick 的 convert,这是我在 atm 上得到的:

convert -background "#ffffff" -size 800x480 -fill "#000000" -pointsize 72 -gravity Forget label:'mytext' output.png

呈现如下:

gravity 似乎会影响标签的位置,但没有随机选项。

更新答案

好的,我想你可以画出文字,trim 把它画到一英寸以内,然后用 50px 的白色填充它,然后把它随机放在最后的 canvas :

#!/bin/bash

bd=50   # 50px white space around letters
ps=72   # pointsize of letters
fh=480  # final height
fw=800  # final width
tmp="/tmp/$$.mpc" # temporary file

# Generate the text with padding all round so it can't touch edges and get its size
read w h < <(magick -pointsize $ps label:"" -trim -bordercolor white -border $bd -write "$tmp" -format "%w %h" info:)
echo "DEBUG: Text requires ${w}x${h} px"

# Work out random x,y offset from top-left where to place text
((x=RANDOM%(fw-w)))
((y=RANDOM%(fh-h)))

magick -size ${fw}x${fh} xc:white "$tmp" -geometry "+${x}+${y}" -composite result.png

然后您将其保存为 doit 并使其可执行:

chmod +x doit

然后调用它:

./doit "Your text"
DEBUG: Text requires 381x153 px

result.png

这是一个 100 帧的动画:

原答案

这是一个基本模板,可在距图像中心偏移 +50+20 的位置绘制文本:

magick -size 640x480 xc:white -fill black -pointsize 72 -gravity center -annotate +50+20  "My Text" result.png


然后您可以随机化 +X+Y 坐标(如果您想要 centre-point 的上方和左侧而不是下方和右侧的位置偏移,也可以使用 -X-Y)使用您的 shell。像这样:

for ((i=0;i<20;i++)) ; do 
  ((X=RANDOM%80))
  ((Y=RANDOM%80)) 
  magick -size 640x480 xc:white -fill black -pointsize 72 -gravity center -annotate +${X}+${Y}  "My Text" miff:- 
done | magick -delay 80 miff:- animated.gif

在 Mark Setchell 的回答中,还可以使用 ImageMagick 内部 fx:rand() 操作来进行随机偏移。 rand() 函数 returns 一个介于 0 和 1 之间的值。

magick -size ${fw}x${fh} xc:white "$tmp" -geometry "+%[fx:($fw-$w)*rand()]+%[fx:($fh-$h)*rand()]" -composite result.png

这是一个 one-line 命令,可以在 ImageMagick 7 中执行您想要的操作。这是基于 Mark Setchell 的回答,添加了使用 -set 选项来保存文本图像大小和使用 ImageMagick rand() 函数进行随机化。请注意,-set 选项变量可用于 fx 计算。

bd=50   # 50px white space around letters
ps=72   # pointsize of letters
fh=480  # final height
fw=800  # final width
text="THIS IS A TEST"
magick \
\( -background white -fill black \
    -pointsize $ps -gravity center label:"$text" \
    -trim +repage -bordercolor white -border $bd \
    -set option:ww "%[fx:$fw-w]" \
    -set option:hh "%[fx:$fh-h]" \) \
-size ${fw}x${fh} xc:white +swap \
-gravity northwest \
-geometry +"%[fx:%[ww]*rand()]"+"%[fx:%[hh]*rand()]" \
-composite result.png