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()