在Wand中为文本动画构建框架

时间:2017-12-28 15:29:37

标签: python wand

我试图在Python上的Wand中编写一个自动脚本,通过一次写一个字母的图片标题来构建文本动画的帧。

问题在于,当我使用caption命令编写一个字母时(文档此处为http://docs.wand-py.org/en/0.4.4/wand/image.html),它会写一个巨大的字母,而当我写完整个文本时,它很适合图像。

我想到了一个可能的解决方案:将第一个字母写成彩色,其余部分透明并循环显示,但据我所知,caption命令无法执行多色文本。

如果有人可以建议我另一种选择,我将不胜感激。我可以使用draw.text,但据我所知,这并没有自动计算下一行的时间...

我的代码如下所示:

imgname = random.choice(os.listdir('/home/gionny/Downloads/HighResImg'))
text = 'Hello, world! This is a slightly longer sentence.'
fontname = random.choice(os.listdir('/home/gionny/Downloads/font'))
with Image(filename='HighResImg/'+imgname) as i:    
    font = Font(path = 'font/'+fontname, color = Color('#fff'))
    textWidth = i.width*2/3
    textHeight = i.height*2/3
    offsetLeft = (i.width - textWidth)/2
    offsetTop = (i.height - textHeight)/2
    with Image(filename='logo.gif') as l:
        l.resize(80,80)
        l.transparentize(0.7)
        with Drawing() as draw:
            draw.composite(operator='atop', left=i.width-90, top=i.height-90, width=l.width, height=l.height, image=l)
            for c in range(0, len(text)):
                caption = i.caption(text = text[c], left = offsetLeft, top = offsetTop, width=textWidth, height=textHeight, font = font, gravity = 'center')
                print(caption)
                cl = i.clone()
                cl.format = 'jpeg'
                cl.save(filename='Text/text'+str(c)+'.jpg')
                cl.destroy()

1 个答案:

答案 0 :(得分:1)

  

如果有人可以建议我另一种选择,我将不胜感激。我可以使用draw.text,但据我所知,这不会自动计算下一行的时间...

没有快速解决方法,你负责计算每次迭代的x,y坐标。 特别是使用随机抽取的混合字体时。

为此类事情提供了方法wand.drawing.Drawing.get_font_metrics。只需保留一个蓄电池&每次迭代都会更新。

from wand.image import Image
from wand.color import Color
from wand.drawing import Drawing


with Image(width=400, height=250, background=Color("skyblue")) as background:
    leftOffset = 35  # <= Starting position.
    topOffset = background.height/2;
    for letter in "Hello World":
        with Drawing() as ctx:
            ctx.font = "TimesNewRoman"
            ctx.font_size = 64.0
            metrics = ctx.get_font_metrics(background, letter)
            ctx.text(leftOffset, int(topOffset+metrics.text_height/4), letter)
            with Image(width=background.width,
                       height=background.height,
                       background=Color("transparent")) as frame:
                ctx.draw(frame)
                background.sequence.append(frame)
            leftOffset += int(metrics.text_width)  # <= Adjust for next iteration.
    background.save(filename="output.gif")

output.gif

现在重复下一行流程,如果topOffset大于画布宽度,只需按字体指标text_height增加leftOffset