【问题标题】:Writing text over GIF using PIL not working使用 PIL 在 GIF 上写入文本不起作用
【发布时间】:2017-05-18 06:12:02
【问题描述】:

我正在尝试获取一个.GIF 文件,用PIL 打开它,然后逐帧在其上写入文本。但是,代码只保存了一个图像(1 帧;它不像 .GIF 文件那样移动。

代码:

import giphypop
from urllib import request
from PIL import Image
from PIL import ImageFont
from PIL import ImageDraw 

g = giphypop.Giphy()

img = g.translate("dog")
request.urlretrieve(img.media_url, "test.gif") 

opened_gif = Image.open("test.gif")
opened_gif.load()
opened_gif.seek(1)

try:
    while 1:
      slide = opened_gif.seek(opened_gif.tell()+1)
      draw = ImageDraw.Draw(slide)
      # font = ImageFont.truetype(<font-file>, <font-size>)
      font = ImageFont.truetype("sans-serif.ttf", 16)
      # draw.text((x, y),"Sample Text",(r,g,b))
      draw.text((0, 0),"Sample Text",(255,255,255),font=font)
except EOFError:
    pass # end of sequence

except AttributeError:
    print("Couldn't use this slide")

opened_gif.save('test_with_caption.gif')

【问题讨论】:

  • 据我所知,PIL 无法保存动画 GIF。您将不得不在分离的图像中写入每一帧,并使用不同的工具将所有帧连接到一个 GIF 中。您可以尝试ffmpegImageMagic 将图像加入动画 GIF。或者您可以查看moviepy 模块来创建动画。
  • @furas 好的。但是,为什么它不保存示例文本的 1 帧呢?它所做的只是保存 1 张带有 no 文本的图像。
  • 我无法检查 - 你在 slice 上工作,但你保存 opened_gif
  • 顺便说一句:不要在except 中使用pass,因为你可能会遇到一些你不知道的错误。
  • 查看如何使用框架:stackoverflow.com/a/35615319/1832058

标签: python image python-3.x python-imaging-library gif


【解决方案1】:

https://github.com/python-pillow/Pillow/issues/3128 的代码很好地解决了这个问题。

from PIL import Image, ImageDraw, ImageSequence
import io

im = Image.open('Tests/images/iss634.gif')

# A list of the frames to be outputted
frames = []
# Loop over each frame in the animated image
for frame in ImageSequence.Iterator(im):
    # Draw the text on the frame
    d = ImageDraw.Draw(frame)
    d.text((10,100), "Hello World")
    del d

    # However, 'frame' is still the animated image with many frames
    # It has simply been seeked to a later frame
    # For our list of frames, we only want the current frame

    # Saving the image without 'save_all' will turn it into a single frame image, and we can then re-open it
    # To be efficient, we will save it to a stream, rather than to file
    b = io.BytesIO()
    frame.save(b, format="GIF")
    frame = Image.open(b)

    # Then append the single frame image to a list of frames
    frames.append(frame)
# Save the frames as a new image
frames[0].save('out.gif', save_all=True, append_images=frames[1:])

【讨论】:

    猜你喜欢
    • 2020-04-11
    • 1970-01-01
    • 2021-04-04
    • 1970-01-01
    • 2017-08-10
    • 2019-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多