本サイトは広告・プロモーションが含まれています
Python

【Pythonで猫ミームGIF作成】背景画像とgifと文字を組み合わせる

少し流行りは終わりつつあるかもですが、猫ミームGIFを作成するコードを紹介したいと思います。
作ったGIFをLINEとかで使って遊んでみてください。

お金をかけずに無料で出来るのでぜひご参考ください。

コード紹介


今回は↓のようなGIFを作成するコードの紹介。

本コードではライブラリはPILのみを使用しています。
必要に応じてインストールしてください。

from PIL import Image, ImageDraw, ImageSequence, ImageFont

def create_composite_gif_with_text(background_path, gif_path, output_path):
    print("作成中...")

    # テキストの設定
    text1 = "   この記事を読めば\n自分で猫ミームのGIFを作れるぞ"
    text2 = "ぜひ読んでいってくれよな"
    text_color = "green"
    stroke_width = 3
    stroke_fill = "black"
    font = ImageFont.truetype("YuGothB.ttc", 48)
    
    # 背景画像を読み込む
    background = Image.open(background_path)
    # アニメーションGIFを読み込む
    gif = Image.open(gif_path)
    total_frames = sum(1 for _ in ImageSequence.Iterator(gif))
    split_frame_count = int(total_frames * 0.6)

    #フレーム処理の部分
    frames = []
    frame_count = 0   
    # GIFの各フレームに対して処理を行う
    for frame in ImageSequence.Iterator(gif):
        frame_count += 1
        # フレームのサイズを2倍に変更
        resized_frame = frame.resize((gif.width * 2, gif.height * 2), Image.Resampling.LANCZOS)     
        # 背景画像のコピーを作成
        composite_frame = background.copy()     
        # サイズ変更したフレームを背景画像の上に貼り付ける
        composite_frame.paste(resized_frame, ((background.width - resized_frame.width) // 2, (background.height - resized_frame.height) // 2), resized_frame.convert('RGBA'))        
        # フレームに対応するテキストを追加
        draw = ImageDraw.Draw(composite_frame)
        
        if frame_count <= split_frame_count:
            # 前半のフレームにtext1を追加
            text_bbox = draw.textbbox((0, 0), text1, font=font)
            text_width = text_bbox - text_bbox[0]
            text_height = text_bbox - text_bbox
            text_x = (background.width - text_width) // 2
            text_y = (background.height - resized_frame.height) // 2 - text_height -30# GIFの上に配置
            draw.text((text_x, text_y), text1, font=font, fill=text_color, stroke_width=stroke_width, stroke_fill=stroke_fill)
        else:
            # 後半のフレームにtext2を追加
            text_bbox = draw.textbbox((0, 0), text2, font=font)
            text_width = text_bbox - text_bbox[0]
            text_height = text_bbox - text_bbox
            text_x = (background.width - text_width) // 2
            text_y = (background.height - resized_frame.height) // 2 - text_height -30
            draw.text((text_x, text_y), text2, font=font, fill=text_color, stroke_width=stroke_width, stroke_fill=stroke_fill)
        
        # 合成されたフレームをリストに追加
        frames.append(composite_frame)
    
    # 合成されたフレームを使用して新しいGIFを作成
    frames[0].save(
        output_path,
        save_all=True,
        append_images=frames,
        duration=gif.info['duration'],
        loop=0
    )

create_composite_gif_with_text('background.png', 'file.gif', 'output.gif')

コードの解説


このコードを実行する前に下記のファイルを、Pythonテキストと同じ階層に置きます。

  • 背景画像(background.png):お好きなものをお使いください
  • GIF画像(file.gif):ネットからお好きなものをお探しください
  • フォントファイル(”YuGothB.ttc”)← PC内からコピペしてください


↑のヤギのGIFでは
下記の画像をbackground.pngとして使用しました。(ChatGPT4で適当に出力した画像です。)

またGIFはなんでもいいので、file.gifとつけてご用意ください。
僕は適当にヤギのGIFを用意しました。

フォントはYuGothB.ttcを使っています。
PC内のフォントファイルをコピーして、pythonのテキストファイルと同じフォルダにいれてください。

調整が必要な部分


入力する文字とその大きさ、文字の位置は調整して使ってください。
例えば

text_y = (background.height - resized_frame.height) // 2 - text_height -30

の部分を

text_y = (background.height - resized_frame.height) // 2 - text_height


にすると文字がGIFの上下中央になります。

GIFを保存するコード

frames[0].save(
        output_path,
        save_all=True,
        append_images=frames,
        duration=gif.info['duration'],
        loop=0
    )

PythonのPillowライブラリを使用して複数の画像フレームからなる新しいGIFアニメーションを作成し保存するためのものです。具体的にはframesリストに格納された画像フレームを使用して、一つのGIFファイルを生成しています。

引数について解説すると

frames[0].save(output_path, …): framesリストの最初の画像(frames[0])のsaveメソッドを呼び出して、GIFを保存します。output_pathは保存するGIFファイルの名前やパスを指定します。

save_all=True: このオプションをTrueに設定することで、framesリスト内の全ての画像フレームを一つのGIFファイルに保存します。

append_images=frame[1:]最初のフレームに続いて追加する画像フレームのリストを指定します。frames[1:]は、リストの最初の要素を除く全ての要素を取得します。つまり2番目のフレームから最後のフレームまでがここに含まれます

duration=gif.info[‘duration’]: 各フレームの表示時間(ミリ秒単位)を指定します。この例では元のGIFファイル(gifオブジェクト)からduration情報を取得して使用しています。これにより新しいGIFのフレームレートが元のGIFと同じになります。

loop=0: GIFアニメーションのループ回数を指定します。0を指定するとアニメーションは無限に繰り返されます

このコードにより、元のGIFアニメーションのフレームレートやループ設定を保持しつつ新しい画像やテキストを追加したカスタマイズされたGIFアニメーションを作成しています。

おわりに


Pythonを使うと無料でGIFファイルを編集することができます。
LINEのジョークなど用のGIFを作成して使ってみてください。

それでは。

追記:記事のタイトルが猫ミームなのにヤギのGIF使うタイトル詐欺で申し訳ございません。


COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA