如何在gif上制作随机文本?

时间:2018-10-18 13:42:03

标签: imagemagick imagemagick-convert

我想更改gif上的文本,将“ YOU”更改为其他字词,但我不知道该怎么做。

source gif

1 个答案:

答案 0 :(得分:1)

以下是一些使用Imagemagick进行所需操作的unix bash代码。请注意,您没有完全清除头部图像中的所有旧文本,因此在第35帧附近,仍然显示“ y”。

输入:

enter image description here

我所做的是在头部的顶部测量一个矩形区域,以限制绘制文本的位置。我通过要绘制的文本的宽度和高度来校正该区域。然后,我遍历45个帧中的每个帧,并为每个点大小(5到18之间),框边界内的x位置和y位置计算30个随机值。我保存了一个累加值列表,以与-annotate函数一起使用以在框架中绘制文本。在用随机值绘制文本的所有帧之后,我将创建最终的动画。

cd
cd desktop/test
text="test"
wd=180
ht=110
xo=100
yo=60
minsize=5
maxsize=18
dims=`convert -pointsize $maxsize label:"$text" -format "%@" info:`
WxH=`echo $dims | cut -d+ -f1`
twidth=`echo $WxH | cut -dx -f1`
theight=`echo $WxH | cut -dx -f2`
ww=$((wd-twidth))
hh=$((ht-theight))
diffsize=$((maxsize-minsize))
numtext=30
for ((j=0; j<45; j++)); do
list=""
jj=`printf "%02d" $j`
echo "$j"
convert head.gif[$j] -background black -flatten tmp$jj.gif
for ((i=0; i<numtext; i++)); do
psize=`convert xc: -format "%[fx:round($minsize+$diffsize*random())]" info:`
xoff=`convert xc: -format "%[fx:round($xo+$ww*random())]" info:`
yoff=`convert xc: -format "%[fx:round($yo+$hh*random())]" info:`
list="$list -pointsize $psize -annotate +${xoff}+${yoff} '$text'"
done
convert tmp$jj.gif -font arial -fill white $list tmp$jj.gif
done
convert -delay 20 tmp*.gif -loop 0 head_test.gif
rm -f tmp*.gif
cd


enter image description here

如果要旋转文本,请按如下所示修改-annotate参数。在这里,我逆时针旋转-10度,但要进行注释,我需要使用等效的正向旋转,即350度。

cd
cd desktop/test
text="test"
wd=180
ht=110
xo=100
yo=60
minsize=5
maxsize=18
dims=`convert -pointsize $maxsize label:$text -format "%@" info:`
WxH=`echo $dims | cut -d+ -f1`
twidth=`echo $WxH | cut -dx -f1`
theight=`echo $WxH | cut -dx -f2`
ww=$((wd-twidth))
hh=$((ht-theight))
diffsize=$((maxsize-minsize))
numtext=30
for ((j=0; j<45; j++)); do
list=""
jj=`printf "%02d" $j`
echo "$j"
convert head.gif[$j] -background black -flatten tmp$jj.gif
for ((i=0; i<numtext; i++)); do
psize=`convert xc: -format "%[fx:round($minsize+$diffsize*random())]" info:`
xoff=`convert xc: -format "%[fx:round($xo+$ww*random())]" info:`
yoff=`convert xc: -format "%[fx:round($yo+$hh*random())]" info:`
list="$list -pointsize $psize -annotate 350x350+${xoff}+${yoff} '$text'"
done
convert tmp$jj.gif -font arial -fill white $list tmp$jj.gif
done
convert -delay 20 tmp*.gif -loop 0 head_test.gif
rm -f tmp*.gif
cd


enter image description here