字幕がスクロールするGIFアニメを作成する
スターウォーズのオープニング画面のように、画面の下からテキストが現れ上に移動するGIFアニメを作成します。折り返したテキストの描画開始位置を少しずつ変えることでスクロール効果を表現します。
関連記事
画像を描画しアニメーションGIFを作成する
テキストを折り返し画像に収まるように表示する
環境
- windows10 home
- Anaconda 3/ jupyter notebook 5.6.0
- Python 3.7.0
- Pillow 5.2.0
コード
from PIL import Image, ImageDraw, ImageFont import textwrap images =[] # イメージ用リスト # 表示させる文章 text = 'ゆく河の流れは絶えずして、しかももとの水にあらず。淀みに浮かぶうたかたは、かつ消えかつ結びて、久しくとどまりたるためしなし。世の中にある人とすみかと、またかくのごとし。 たましきの都のうちに、棟を並べ、甍を争へる、高き、卑しき、人のすまひは、世々を経て尽きせぬものなれど、これをまことかと尋ぬれば、昔ありし家はまれなり。' wrap_list = textwrap.wrap(text, 16) # テキストを16文字で改行しリストwrap_listに代入 font = ImageFont.truetype('C:\Windows\Fonts\meiryo.ttc', 36) # フォントの指定 for y_start in range(500,-680,-5): # 文字列の描画開始位置を500から-680まで-5ずつ変える im = Image.new('RGB', (640, 480), (0, 0, 0)) # 下地となるイメージオブジェクトの生成 draw = ImageDraw.Draw(im) # drawオブジェクトを生成 draw.rectangle((0,0,639,479), fill=(0,0,0), outline=(0,0,0)) # 画像を黒ベタで消去 line_counter = 0 # 行数のカウンター for line in wrap_list: # wrap_listから1行づつ取り出しlineに代入 y = line_counter*70+y_start # y座標をline_counterに応じて下げる draw.multiline_text((35, y),line, fill=(255,255,255), font=font) # 1行分の文字列を画像に描画 line_counter = line_counter +1 # 行数のカウンターに1 images.append(im) # リストにイメージを追加 images[0].save('text_scroll.gif',save_all=True,append_images=images[1:],optimize=False,duration=50,loop=0) # gifアニメ保存
実行結果
字幕がスクロールするGIF動画が生成されます