File size: 1,871 Bytes
e9c4020
51e5e37
9f3650c
51e5e37
9f3650c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e9c4020
 
 
9f3650c
e9c4020
 
9f3650c
51e5e37
9f3650c
 
e9c4020
 
 
 
 
 
 
 
9f3650c
 
e9c4020
 
 
9f3650c
e9c4020
9f3650c
e9c4020
 
 
 
9f3650c
 
 
 
e9c4020
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
import gradio as gr
from PIL import Image, ImageSequence
from moviepy.editor import VideoFileClip

def edit_file(file, loop_count, speed_factor, frame_skip):
    file_name = file.name.split("/")[-1]  # 元ファイル名を取得
    base_name = file_name.rsplit(".", 1)[0]  # 拡張子を除いた部分

    # ファイルがGIFか動画か判定
    if file.name.endswith((".mp4", ".avi", ".mov", ".mkv")):
        # 動画をGIFに変換
        clip = VideoFileClip(file.name)
        gif_path = f"{base_name}.gif"
        clip.write_gif(gif_path, fps=10)
        gif = Image.open(gif_path)
    else:
        gif = Image.open(file.name)

    # GIF編集処理
    frames = []
    durations = []
    for i, frame in enumerate(ImageSequence.Iterator(gif)):
        if i % frame_skip != 0:  # フレームスキップ
            continue
        frames.append(frame.copy())
        durations.append(gif.info.get("duration", 100) // speed_factor)

    # 保存先をアップロードされたファイル名ベースに
    output_path = f"{base_name}_edited.gif"
    frames[0].save(
        output_path,
        save_all=True,
        append_images=frames[1:],
        loop=loop_count,
        duration=durations,
        disposal=2
    )

    return output_path, output_path  # プレビュー表示用に同じパスを返す

# Gradioインターフェース
interface = gr.Interface(
    fn=edit_file,
    inputs=[
        gr.File(label="GIFまたは動画をアップロード"),
        gr.Number(label="ループ回数(0は無限ループ)", value=0),
        gr.Number(label="再生速度の倍率(例: 2は2倍速)", value=1),
        gr.Number(label="フレームスキップ数", value=1),
    ],
    outputs=[
        gr.File(label="ダウンロードリンク"),
        gr.Image(label="プレビュー", type="file")
    ]
)

interface.launch()