Pythonでいろいろやってみる

Pythonを使った画像処理や機械学習などの簡単なプログラムを載せています。

字幕がスクロールする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動画が生成されます f:id:T_A_T:20200210222553g:plain

ブログランキングに参加しています

にほんブログ村 IT技術ブログへ
にほんブログ村