我试图在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()
答案 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")
现在重复下一行流程,如果topOffset
大于画布宽度,只需按字体指标text_height
增加leftOffset
。