File size: 2,167 Bytes
e9c4020
51e5e37
5cd20ff
51e5e37
9f3650c
 
 
 
 
 
 
 
5cd20ff
 
 
 
 
 
 
 
 
 
 
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
58
59
60
61
62
63
64
65
66
import gradio as gr
from PIL import Image, ImageSequence
import imageio

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に変換
        gif_path = f"{base_name}.gif"
        video = imageio.get_reader(file.name)
        frames = []
        for i, frame in enumerate(video):
            # 指定したフレーム数ごとにスキップ
            if i % frame_skip != 0:
                continue
            # 再生速度調整
            frames.append(frame)
        
        # GIFとして保存
        imageio.mimsave(gif_path, frames, duration=1/speed_factor)
        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()