Spaces:
Running
Running
File size: 1,926 Bytes
e9c4020 51e5e37 5cd20ff 51e5e37 9f3650c 1b88ba6 9f3650c 1b88ba6 9f3650c 5cd20ff 1b88ba6 5cd20ff 9f3650c 1b88ba6 e9c4020 1b88ba6 e9c4020 1b88ba6 51e5e37 1b88ba6 9f3650c e9c4020 9f3650c 1b88ba6 e9c4020 9f3650c e9c4020 9f3650c e9c4020 1b88ba6 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 |
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) # 再生速度調整
# 保存
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="フレームスキップ数(1以上)", value=1, min=1),
],
outputs=[
gr.File(label="ダウンロードリンク"),
gr.Image(label="プレビュー", type="filepath")
]
)
interface.launch()
|