创建一个带有随机放置在中心周围的字符串的图像
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
我正在尝试创建一组非常简单的图像,只是白色背景上的一个字符串。
我希望字符串位于图像中的随机位置,围绕中心,以便整个字符串可见(即 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