import os import gradio as gr from core.settings import * from .shared import txt2img_ui, img2img_ui, inpaint_ui, outpaint_ui, hires_fix_ui MAX_DYNAMIC_CONTROLS = 10 def get_preprocessor_choices(): from nodes import NODE_DISPLAY_NAME_MAPPINGS preprocessor_names = [ display_name for class_name, display_name in NODE_DISPLAY_NAME_MAPPINGS.items() if "Preprocessor" in class_name or "Segmentor" in class_name or "Estimator" in class_name or "Detector" in class_name ] return sorted(list(set(preprocessor_names))) def build_ui(event_handler_function): ui_components = {} with gr.Blocks() as demo: gr.Markdown("# ImageGen - Illustrious") gr.Markdown( "This demo is a streamlined version of the [Comfy web UI](https://github.com/RioShiina47/comfy-webui)'s ImgGen functionality. " "Other versions are also available: " "[Z-Image](https://huggingface.co/spaces/RioShiina/ImageGen-Z-Image), " "[Qwen-Image](https://huggingface.co/spaces/RioShiina/ImageGen-Qwen-Image), " "[NoobAI](https://huggingface.co/spaces/RioShiina/ImageGen-NoobAI), " "[Pony](https://huggingface.co/spaces/RioShiina/ImageGen-Pony1), " "[SDXL](https://huggingface.co/spaces/RioShiina/ImageGen-SDXL), " "[SD1.5](https://huggingface.co/spaces/RioShiina/ImageGen-SD15)" ) with gr.Tabs(elem_id="tabs_container") as tabs: with gr.TabItem("Illustrious", id=0): with gr.Tabs(elem_id="image_gen_tabs") as image_gen_tabs: with gr.TabItem("Txt2Img", id=0): ui_components.update(txt2img_ui.create_ui()) with gr.TabItem("Img2Img", id=1): ui_components.update(img2img_ui.create_ui()) with gr.TabItem("Inpaint", id=2): ui_components.update(inpaint_ui.create_ui()) with gr.TabItem("Outpaint", id=3): ui_components.update(outpaint_ui.create_ui()) with gr.TabItem("Hires. Fix", id=4): ui_components.update(hires_fix_ui.create_ui()) ui_components['image_gen_tabs'] = image_gen_tabs with gr.TabItem("Controlnet Preprocessors", id=1): gr.Markdown("## ControlNet Auxiliary Preprocessors") gr.Markdown("Powered by [Fannovel16/comfyui_controlnet_aux](https://github.com/Fannovel16/comfyui_controlnet_aux).") gr.Markdown("Upload an image or video to process it with a ControlNet preprocessor.") with gr.Row(): with gr.Column(scale=1): cn_input_type = gr.Radio(["Image", "Video"], label="Input Type", value="Image") cn_image_input = gr.Image(type="pil", label="Input Image", visible=True, height=384) cn_video_input = gr.Video(label="Input Video", visible=False) preprocessor_cn = gr.Dropdown(label="Preprocessor", choices=get_preprocessor_choices(), value="Canny Edge") preprocessor_model_cn = gr.Dropdown(label="Preprocessor Model", choices=[], value=None, visible=False) with gr.Column() as preprocessor_settings_ui: cn_sliders, cn_dropdowns, cn_checkboxes = [], [], [] for i in range(MAX_DYNAMIC_CONTROLS): cn_sliders.append(gr.Slider(visible=False, label=f"dyn_slider_{i}")) cn_dropdowns.append(gr.Dropdown(visible=False, label=f"dyn_dropdown_{i}")) cn_checkboxes.append(gr.Checkbox(visible=False, label=f"dyn_checkbox_{i}")) run_cn = gr.Button("Run Preprocessor", variant="primary") with gr.Column(scale=1): output_gallery_cn = gr.Gallery(label="Output", show_label=False, object_fit="contain", height=512) zero_gpu_cn = gr.Number(label="ZeroGPU Duration (s)", value=None, placeholder="Default: 60s, Max: 120s", info="Optional") ui_components.update({ "cn_input_type": cn_input_type, "cn_image_input": cn_image_input, "cn_video_input": cn_video_input, "preprocessor_cn": preprocessor_cn, "preprocessor_model_cn": preprocessor_model_cn, "run_cn": run_cn, "zero_gpu_cn": zero_gpu_cn, "output_gallery_cn": output_gallery_cn, "preprocessor_settings_ui": preprocessor_settings_ui, "cn_sliders": cn_sliders, "cn_dropdowns": cn_dropdowns, "cn_checkboxes": cn_checkboxes }) with gr.TabItem("PNG Info", id=2): with gr.Column(): info_image_input = gr.Image(type="pil", label="Upload Image", height=512) with gr.Row(): info_get_button = gr.Button("Get Info") send_to_txt2img_button = gr.Button("Send to Txt2Img", variant="primary") with gr.Row(): send_to_img2img_button = gr.Button("Send to Img2Img") send_to_inpaint_button = gr.Button("Send to Inpaint") send_to_outpaint_button = gr.Button("Send to Outpaint") send_to_hires_fix_button = gr.Button("Send to Hires. Fix") gr.Markdown("### Positive Prompt"); info_prompt_output = gr.Textbox(lines=3, interactive=False, show_label=False) gr.Markdown("### Negative Prompt"); info_neg_prompt_output = gr.Textbox(lines=3, interactive=False, show_label=False) gr.Markdown("### Other Parameters"); info_params_output = gr.Textbox(lines=5, interactive=False, show_label=False) ui_components.update({ "info_image_input": info_image_input, "info_get_button": info_get_button, "send_to_txt2img_button": send_to_txt2img_button, "send_to_img2img_button": send_to_img2img_button, "send_to_inpaint_button": send_to_inpaint_button, "send_to_outpaint_button": send_to_outpaint_button, "send_to_hires_fix_button": send_to_hires_fix_button, "info_prompt_output": info_prompt_output, "info_neg_prompt_output": info_neg_prompt_output, "info_params_output": info_params_output }) ui_components["tabs"] = tabs gr.Markdown("
Made by RioShiina with ❤️
GitHub | Hugging Face | Civitai
") event_handler_function(ui_components, demo) return demo