Spaces:
Running
Running
File size: 3,999 Bytes
d124c09 26c1b15 49914b6 8797284 8a82434 d124c09 a133c54 d124c09 49914b6 8a82434 49914b6 8a82434 49914b6 d124c09 26c1b15 8a82434 d124c09 8797284 370793b d124c09 370793b d124c09 8797284 8a82434 8797284 d124c09 8a82434 8797284 8a82434 8797284 166f4ed d124c09 8a82434 |
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 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 |
# --- app.py ---
import json
import math
import gradio as gr
from PIL import Image, ImageDraw
import os
import shutil
from utils.keyframe_utils import generate_keyframe_prompt, generate_all_keyframe_images
# Load segments JSON
def load_segments():
with open("segments_full.json", "r", encoding="utf-8") as f:
segments = json.load(f)
return segments[:5] # return only the first 5 segments for initial testing
# Load pre-generated keyframe images (3 per segment)
def get_keyframe_images(segment_id):
images = []
for i in range(1, 4):
img_path = f"keyframes/segment_{segment_id}_v{i}.png"
if os.path.exists(img_path):
images.append(Image.open(img_path).resize((128, 72)))
else:
img = Image.new("RGB", (128, 72), color=(200, 200, 200))
draw = ImageDraw.Draw(img)
draw.text((10, 30), "No Image", fill=(0, 0, 0))
images.append(img)
return images
def segment_display(segment):
seg_id = segment.get("segment_id")
description = segment.get("description", "")
short_desc = description if len(description) <= 120 else description[:117] + "..."
def wrap_text(text, width=40):
return "\n".join([text[i:i+width] for i in range(0, len(text), width)])
display_desc = wrap_text(short_desc)
row = [f"Segment {seg_id}", display_desc]
row.extend(get_keyframe_images(seg_id))
return row
def paginate_segments(page=1, page_size=15):
segments = load_segments()
total = len(segments)
max_page = math.ceil(total / page_size)
start = (page - 1) * page_size
end = start + page_size
subset = segments[start:end]
headers = ["Segment ID", "Description", "Candidate 1", "Candidate 2", "Candidate 3"]
data = [segment_display(seg) for seg in subset]
return headers, data, max_page
def zip_keyframe_folder():
zip_name = "keyframes.zip"
if os.path.exists(zip_name):
os.remove(zip_name)
shutil.make_archive("keyframes", 'zip', "keyframes")
return zip_name
def build_interface():
with gr.Blocks() as demo:
gr.Markdown("## 🎬 Keyframe Candidate Viewer")
page_state = gr.State(1)
table = gr.Dataframe(
headers=["Segment ID", "Description", "Candidate 1", "Candidate 2", "Candidate 3"],
datatype=["str", "str", "image", "image", "image"],
row_count=15
)
total_pages_text = gr.Textbox(label="Page Info", interactive=False)
def update(page):
headers, rows, max_page = paginate_segments(page)
return gr.update(headers=headers, value=rows), f"Page {page} of {max_page}", page
def generate_and_refresh(_):
segments = load_segments()
generate_all_keyframe_images(segments)
return update(1)
with gr.Row():
prev_btn = gr.Button("⬅", size="sm")
next_btn = gr.Button("➡", size="sm")
prev_btn.click(fn=lambda p: max(1, p - 1), inputs=page_state, outputs=page_state).then(update, inputs=page_state, outputs=[table, total_pages_text, page_state])
next_btn.click(fn=lambda p: p + 1, inputs=page_state, outputs=page_state).then(update, inputs=page_state, outputs=[table, total_pages_text, page_state])
demo.load(fn=update, inputs=page_state, outputs=[table, total_pages_text, page_state])
gr.Markdown("### 🖼️ 生成所有分镜的关键帧图像")
generate_btn = gr.Button("🛠️ 一键生成图像")
generate_btn.click(fn=generate_and_refresh, inputs=[page_state], outputs=[table, total_pages_text, page_state])
gr.Markdown("### 📦 打包下载 keyframes 文件夹(包含图片和 prompts.json)")
zip_btn = gr.Button("📁 生成 ZIP")
zip_file_output = gr.File(label="下载 ZIP")
zip_btn.click(fn=zip_keyframe_folder, outputs=zip_file_output)
return demo
if __name__ == "__main__":
demo = build_interface()
demo.launch()
|