File size: 2,102 Bytes
e9c4020
51e5e37
5cd20ff
51e5e37
9f3650c
1b88ba6
 
9f3650c
1b88ba6
9f3650c
 
5cd20ff
 
 
1b88ba6
 
5cd20ff
9f3650c
 
 
 
1b88ba6
e9c4020
 
1b88ba6
e9c4020
1b88ba6
 
 
51e5e37
e85f01b
 
f0c236a
 
9f3650c
e9c4020
 
 
 
e85f01b
e9c4020
f0c236a
e9c4020
9f3650c
1b88ba6
e9c4020
 
 
9f3650c
e9c4020
9f3650c
e9c4020
 
42e0d78
e9c4020
9f3650c
 
1b88ba6
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
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_path = f"{base_name}.gif"
        video = imageio.get_reader(file.name)
        frames = []
        for i, frame in enumerate(video):
            if i % frame_skip == 0:  # フレーム間引き
                frames.append(frame)
        imageio.mimsave(gif_path, frames, duration=1/speed_factor)
        gif = Image.open(gif_path)
    else:
        gif = Image.open(file.name)

    # GIF編集
    frames = []
    durations = []
    original_duration = gif.info.get("duration", 100)  # フレーム間の時間(ms)
    for i, frame in enumerate(ImageSequence.Iterator(gif)):
        if i % frame_skip == 0:  # フレーム間引き
            frames.append(frame.copy())
            durations.append(original_duration // speed_factor)  # 再生速度調整

    # Pillowのループ設定の仕様に合わせて調整
    adjusted_loop_count = 0 if loop_count == 0 else loop_count - 1

    # 保存
    output_path = f"{base_name}_edited.gif"
    frames[0].save(
        output_path,
        save_all=True,
        append_images=frames[1:],
        loop=adjusted_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="フレームスキップ数(1以上)", value=1, minimum=1),
    ],
    outputs=[
        gr.File(label="ダウンロードリンク"),
        gr.Image(label="プレビュー", type="filepath")
    ]
)

interface.launch()