import gradio as gr from PIL import Image import json def extract_parameters(image, show_full_metadata=False): """ Extract and format parameters from a ComfyUI image. If show_full_metadata is False, shows only the main prompt cleanly. If True, shows the full metadata with better formatting. """ try: # Open the uploaded image img = Image.open(image) # Get metadata from the image's info dictionary metadata = img.info if not metadata: return "No parameters found in image metadata." # Check if "prompt" key exists (common in ComfyUI) if "prompt" in metadata: raw_prompt = metadata["prompt"] try: # Parse as JSON if possible prompt_data = json.loads(raw_prompt) # Look for the main prompt text main_prompt = None for node_id, node in prompt_data.items(): if "inputs" in node and "text" in node["inputs"]: text = node["inputs"]["text"] if isinstance(text, str) and text.strip(): main_prompt = text break if not main_prompt: main_prompt = "No clear prompt found in workflow." if show_full_metadata: full_output = "Full Workflow Metadata:\n\n" for node_id, node in prompt_data.items(): full_output += f"Node {node_id}:\n" for key, value in node.items(): full_output += f" {key}: {value}\n" full_output += "\n" return f"Main Prompt:\n{main_prompt}\n\n{full_output}" else: return f"Main Prompt:\n{main_prompt}" except json.JSONDecodeError: if show_full_metadata: return f"Raw Prompt:\n{raw_prompt}\n\nFull Metadata:\n{metadata}" return f"Main Prompt:\n{raw_prompt}" else: if show_full_metadata: output = "Full Metadata:\n\n" for key, value in metadata.items(): output += f"{key}:\n {value}\n\n" return output return "No prompt found, toggle 'Show Full Metadata' for details." except Exception as e: return f"Error processing image: {str(e)}" # Define the Gradio interface with attribution interface = gr.Interface( fn=extract_parameters, inputs=[ gr.Image(type="filepath", label="Upload a ComfyUI Image"), gr.Checkbox(label="Show Full Metadata", value=False) ], outputs=gr.Textbox(label="Extracted Parameters", lines=10), title="ComfyUI Image to Parameters", description=( "Upload a ComfyUI image to extract its prompt. Toggle 'Show Full Metadata' for the complete workflow.\n\n" "This app is inspired by and adapted from ImagePromptViewer by LordKa-Berlin. " "Original creator: LordKa-Berlin. " "Licensed under CC BY 4.0 (https://creativecommons.org/licenses/by/4.0/). " "Source: https://github.com/LordKa-Berlin/ImagePromptViewer. " "Modified by QES for Gradio integration." ), theme="default" ) # Launch the app interface.launch()