【VJ】3D回転するGIF動画を作る Python

この記事は約7分で読めます。

はじめに

VJ とかでイベントとかのロゴを常時出したりすると思うんですけど、たまにもう一捻りしたいときってあるじゃないですか。ちょっと動かしたいみたいな。

表現しづらいんだけど、マクドの看板みたいにクルクル回るみたいなのが理想。

Twitter で Pixiz っていうサービスを紹介して頂いて、ほぼやりたいことが出来たのです。
383teeen 様 ありがとうございます。

フォトモンタージュ カスタマイズ可能な形状と写真による 3D 回転 - Pixiz
独自のフォトモンタージュを作成 カスタマイズ可能な形状と写真による 3D 回転 の上 Pixiz.

それでね、思ったんですよ。

ChatGPT 使って AI 様に同様の Python スクリプト作ってもらえるんじゃないだろうか?って。

というのも、2D 画像を回転させる例は全然出てこないんですけど、 3D プロットされたグラフを回転させる事例は技術ブログでたっくさん出てくるんです。じゃあ、似たようなアプローチでイケるなと。

3D 散布図を回転 GIF アニメーションにする - Qiita
Python にて 3D 散布図を描画して回転する GIF アニメーションとして出力したい、ということをやって少しハマったので、最終的にできた方法をまとめる。GIF アニメに変換する方法としては …

で、数時間の試行錯誤の上、だいたい作ってもらえましたのでシェアしちゃうものでございます。
水平方向への 3D 回転だって伝えたいのに、なんどやっても(反)時計回りにクルクル回りやがるんですよ。いや、プロンプトにする前提の言語化が出来ていなかったので伝え方が悪いんですけど。

で、『3D反転(ミラーリング)』って言ったら近いものが出てきて、そこから GPT-4 に移行しつつプロンプトを重ねていきました。

ありがとう、ChatGPT-4 (課金勢)

出力例と使用例

Resolume とかで GIF 動画の再生が重たいときは、グリーンバックで動画に書き出せば良いんじゃないかな。

スクリプト

Python3 です。事前に PIL(Pillow) のインストールが必要です。
私は Macbook のローカル環境で動かしています。

このスクリプトの動作保証はしませんし、
実行した事によって生じた損害に対する一切の責任を負いません。

使い方

第一引数:インプットファイル名(png or jpg )
第二引数:green を指定するとグリーンバックに。しないと透明に。

透過モード
python3 script.py input_image.png
グリーンバック
python3 script.py input_image.png green

スクリプト

スクリプト名:script.py

import sys
from PIL import Image
import time
import os

def create_3d_effect_gif(input_image_path, num_steps=40, duration=50, resize_ratio=0.5, background="transparent"):
    input_image = Image.open(input_image_path).convert("RGBA")
    resized_image = input_image.resize((int(input_image.width * resize_ratio), int(input_image.height * resize_ratio)))

    width, height = resized_image.size
    frames = []

    # 背景色の設定
    if background == "green":
        bg_color = (0, 255, 0, 255)  # グリーンバック
    else:
        bg_color = (0, 0, 0, 0)  # 透明

    # フレーム処理
    for phase in range(2):
        for step in range(num_steps):
            current_frame = Image.new("RGBA", (width, height), bg_color)
            flip_ratio = step / num_steps if phase == 0 else (num_steps - step) / num_steps

            for y in range(height):
                for x in range(width):
                    pixel = resized_image.getpixel((x, y))
                    current_x = int(x * (1 - flip_ratio) + (width - x - 1) * flip_ratio)
                    if 0 <= current_x < width:
                        current_frame.putpixel((current_x, y), pixel)

            frames.append(current_frame)
            print(f"Processing: {phase * num_steps + step + 1}/{num_steps * 2}")

    # 出力ファイル名の生成
    output_gif_path = os.path.splitext(input_image_path)[0] + ".gif"

    # GIFを保存
    frames[0].save(output_gif_path, save_all=True, append_images=frames[1:], duration=duration, loop=0, disposal=2)

if __name__ == "__main__":
    if len(sys.argv) < 2:
        print("Usage: python script.py <input_image_path> [background]")
    else:
        input_image_path = sys.argv[1]
        background = sys.argv[2] if len(sys.argv) > 2 else "transparent"
        create_3d_effect_gif(input_image_path, background=background)

↑このスクリプトを ChatGPT に貼り付ければ自分好みにカスタマイズ出来るぞ!なんて時代だ!!

ChatGPT 様によるパラメータ指定講座

(私)
おかげで素晴らしいスクリプトになりましたので広くシェアしようと思います。 スクリプト内外で指定できるパラメタを簡潔に解説してください。

素晴らしいです!このスクリプトをシェアする際のために、スクリプト内外で指定できるパラメータについて簡潔に説明します。

コマンドライン引数

  1. <input_image_path> (必須)

    • 説明: 変換する元の画像ファイルへのパス。
    • : python script.py input_image.jpg
  2. [background] (オプション)

    • 説明: GIFの背景色。green を指定するとグリーンバック、それ以外を指定または指定しない場合は透明背景になる。
    • : python script.py input_image.jpg green

スクリプト内パラメータ

  1. num_steps=40

    • 説明: アニメーションのフレーム数。数が多いほど滑らかだが、ファイルサイズが大きくなる。
    • デフォルト値: 40
  2. duration=50

    • 説明: 各フレームの表示時間(ミリ秒単位)。小さいほど高速なアニメーション。
    • デフォルト値: 50
  3. resize_ratio=0.5

    • 説明: 画像のリサイズ比率。1.0 が元のサイズ、0.5 は元の半分のサイズ。
    • デフォルト値: 0.5
  4. background="transparent"

    • 説明: プログラム内で設定される背景色。コマンドライン引数で指定された場合、この値は上書きされる。
    • デフォルト値: "transparent"(透明)

これらのパラメータを使って、ユーザーは自分のニーズに合わせてGIFのアニメーションの挙動をカスタマイズできます。例えば、より高速なアニメーションが必要な場合は duration を小さくし、より滑らかなアニメーションが必要な場合は num_steps を増やすことができます。また、ファイルサイズを減らすためには resize_ratio を下げることが効果的です。

おわりに

私はプログラマではないので今回も Python はほぼ触っていないのですが、
生成 AI ってすごいなあ

タイトルとURLをコピーしました