diff --git a/modules/async_worker.py b/modules/async_worker.py index fab2508e..48626b4c 100644 --- a/modules/async_worker.py +++ b/modules/async_worker.py @@ -22,6 +22,12 @@ def worker(): import shared import random import copy + + # xhoxye4 + # 导入 OpenCV 库 + import cv2 + # xhoxye4 + import modules.default_pipeline as pipeline import modules.core as core import modules.flags as flags @@ -138,6 +144,14 @@ def worker(): uov_input_image = args.pop() outpaint_selections = args.pop() inpaint_input_image = args.pop() + + # xhoxye5 + # 接收参数 + inpaint_mask_image = args.pop() + inpaint_mask_image_checkbox = args.pop() + invert_mask_checkbox = args.pop() + # xhoxye5 + inpaint_additional_prompt = args.pop() cn_tasks = {x: [] for x in flags.ip_list} @@ -273,7 +287,23 @@ def worker(): current_tab == 'ip' and advanced_parameters.mixing_image_prompt_and_inpaint)) \ and isinstance(inpaint_input_image, dict): inpaint_image = inpaint_input_image['image'] - inpaint_mask = inpaint_input_image['mask'][:, :, 0] + + # xhoxye6 + #inpaint_mask = inpaint_input_image['mask'][:, :, 0] + # use uploaded inpaint mask image, if not brush for inpaint. + # 如果没有手涂蒙版,则使用上传蒙版,并缩放。调换判断条件,尝试修复和外部扩充绘制配合时出现的问题. + # 添加反转手涂蒙版的判断 + if inpaint_mask_image_checkbox and not np.any(inpaint_input_image['mask'] == [255, 255, 255]) and inpaint_mask_image is not None: + inpaint_height, inpaint_width = inpaint_image.shape[:2] + resized_mask_image = cv2.resize(inpaint_mask_image, (inpaint_width, inpaint_height)) + + inpaint_mask = resized_mask_image[:, :, 0] + else: + inpaint_mask = inpaint_input_image['mask'][:, :, 0] + if invert_mask_checkbox: + inpaint_mask = np.invert(inpaint_mask) + # xhoxye6 + inpaint_image = HWC3(inpaint_image) if isinstance(inpaint_image, np.ndarray) and isinstance(inpaint_mask, np.ndarray) \ and (np.any(inpaint_mask > 127) or len(outpaint_selections) > 0): diff --git a/webui.py b/webui.py index 8653a554..f7b09f27 100644 --- a/webui.py +++ b/webui.py @@ -186,12 +186,28 @@ with shared.gradio_root: outputs=ip_ad_cols + ip_types + ip_stops + ip_weights, queue=False, show_progress=False) with gr.TabItem(label='Inpaint or Outpaint') as inpaint_tab: - inpaint_input_image = grh.Image(label='Drag above image to here', source='upload', type='numpy', tool='sketch', height=500, brush_color="#FFFFFF", elem_id='inpaint_canvas') + # xhoxye1 + #inpaint_input_image = grh.Image(label='Drag above image to here', source='upload', type='numpy', tool='sketch', height=500, brush_color="#FFFFFF", elem_id='inpaint_canvas') + + with gr.Row(): + inpaint_input_image = grh.Image(label='Drag inpaint or outpaint image to here', source='upload', type='numpy', tool='sketch', height=500, brush_color="#FFFFFF", elem_id='inpaint_canvas') + + inpaint_mask_image = grh.Image(label='Drag inpaint mask image to here', source='upload', type='numpy', height=500,visible=False) + # xhoxye1 + with gr.Row(): inpaint_additional_prompt = gr.Textbox(placeholder="Describe what you want to inpaint.", elem_id='inpaint_additional_prompt', label='Inpaint Additional Prompt', visible=False) outpaint_selections = gr.CheckboxGroup(choices=['Left', 'Right', 'Top', 'Bottom'], value=[], label='Outpaint Direction') inpaint_mode = gr.Dropdown(choices=modules.flags.inpaint_options, value=modules.flags.inpaint_option_default, label='Method') example_inpaint_prompts = gr.Dataset(samples=modules.config.example_inpaint_prompts, label='Additional Prompt Quick List', components=[inpaint_additional_prompt], visible=False) + + # xhoxye2 + with gr.TabItem(label='Inpaint advanced') as inpaint_advanced: + inpaint_mask_image_checkbox = gr.Checkbox(label='Enable upload mask', value=False, container=False) + inpaint_mask_image_checkbox.change(lambda x: gr.update(visible=x), inputs=inpaint_mask_image_checkbox, outputs=inpaint_mask_image, queue=False) + invert_mask_checkbox = gr.Checkbox(label='Invert hand-drawn mask', value=False, container=False) + # xhoxye2 + gr.HTML('* Powered by Fooocus Inpaint Engine \U0001F4D4 Document') example_inpaint_prompts.click(lambda x: x[0], inputs=example_inpaint_prompts, outputs=inpaint_additional_prompt, show_progress=False, queue=False) with gr.TabItem(label='Describe') as desc_tab: @@ -510,7 +526,10 @@ with shared.gradio_root: ctrls += [base_model, refiner_model, refiner_switch] + lora_ctrls ctrls += [input_image_checkbox, current_tab] ctrls += [uov_method, uov_input_image] - ctrls += [outpaint_selections, inpaint_input_image, inpaint_additional_prompt] + # xhoxye3 + #ctrls += [outpaint_selections, inpaint_input_image, inpaint_additional_prompt] + ctrls += [outpaint_selections, inpaint_input_image, inpaint_mask_image, inpaint_mask_image_checkbox, invert_mask_checkbox, inpaint_additional_prompt] + # xhoxye3 ctrls += ip_ctrls state_is_generating = gr.State(False)