gif-editor / app.py
soiz's picture
Update app.py
e85f01b verified
raw
history blame
2.1 kB
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()