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