Spaces:
Running
Running
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()
|