Spaces:
Paused
Paused
| 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, # ループ回数(0は無限ループ、1は1回ループ) | |
| 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() | |