a1111-sd-webui-haku-img/scripts/main.py

250 lines
12 KiB
Python

from modules import scripts
from modules import script_callbacks, shared
from modules import generation_parameters_copypaste as gpc
from modules.ui_components import FormRow
import gradio as gr
from PIL import Image, ImageFilter, ImageEnhance, ImageColor
import cv2
import numpy as np
from hakuimg import(
blend,
blur,
color,
sketch,
pixel
)
from inoutpaint import main as outpaint
'''
UI part
'''
inpaint_base: gr.Image
inpaint_mask: gr.Image
all_btns: list[tuple[gr.Button, ...]] = []
layers = 5
class Script(scripts.Script):
def title(self):
return "HakuBlend"
def show(self, is_img2img):
return scripts.AlwaysVisible
def after_component(self, component, **kwargs):
global img_src, all_btns, inpaint_base, inpaint_mask
if isinstance(component, gr.Gallery):
if component.elem_id in {'txt2img_gallery', 'img2img_gallery'}:
img_src = component
val = kwargs.get("value", "")
id = kwargs.get("elem_id", "")
if id=='img_inpaint_base':
inpaint_base = component
if id=='img_inpaint_mask':
inpaint_mask = component
if val == "Send to extras":
with gr.Accordion('HakuImg', open=False):
with gr.Column():
with gr.Accordion('Send to Blend', open=False):
btns = []
for i in range(layers):
btn1 = gr.Button(f"Send to Layer{i+1}")
btn1.click(None, _js=f"switch_to_haku_img")
btns.append(btn1)
with gr.Column():
btn3 = gr.Button("Send to Effect")
btn3.click(None, _js=f"switch_to_haku_img_eff")
all_btns.append((btns, btn3, img_src))
def ui(self, is_img2img):
return []
def add_tab():
print('add tab')
with gr.Blocks(analytics_enabled=False) as demo:
with FormRow().style(equal_height=False):
with gr.Column():
with gr.Tabs(elem_id="haku_blend_tabs"):
with gr.TabItem('Blend', elem_id='haku_blend'):
all_layers = []
all_alphas = []
all_mask_str = []
all_mask_blur = []
img_blend_h_slider = gr.Slider(160, 1280, 320, step=10, label="Image preview height", elem_id='haku_img_h_blend')
with gr.Tabs(elem_id="haku_blend_layers_tabs"):
for i in range(1, layers+1):
with gr.TabItem(f'Layer{i}', elem_id=f'haku_blend_Layer{i}'):
all_layers.append(
gr.ImageMask(type='numpy', label=f"Layer{i}", elem_id=f'haku_img_blend{i}')
)
all_alphas.append(
gr.Slider(0, 1, 0.5, label=f"Layer{i} transparent")
)
all_mask_blur.append(
gr.Slider(0, 32, 4, label=f"Layer{i} mask blur")
)
all_mask_str.append(
gr.Slider(0, 1, 1, label=f"Layer{i} mask strength")
)
bg_color = gr.ColorPicker('#FFFFFF', label='background color')
expand_btn = gr.Button("refresh", variant="primary")
with gr.TabItem('Effect', elem_id='haku_eff'):
img_eff_h_slider = gr.Slider(160, 1280, 320, step=10, label="Image preview height", elem_id='haku_img_h_eff')
image_eff = gr.Image(type='numpy', label="img", elem_id='haku_img_eff', show_label=False)
with gr.Tabs(elem_id='effect_tabs'):
with gr.TabItem('Color', elem_id='haku_color'):
temp_slider = gr.Slider(-100, 100, 0, step=1, label="temparature")
hue_slider = gr.Slider(-90, 90, 0, step=1, label="hue")
bright_slider = gr.Slider(-100, 100, 0, step=1, label="brightness")
contrast_slider = gr.Slider(-100, 100, 0, step=1, label="contrast")
sat_slider = gr.Slider(-100, 100, 0, step=1, label="saturation")
gamma_slider = gr.Slider(0.2, 2.2, 1, step=0.1, label="Gamma")
color_btn = gr.Button("refresh", variant="primary")
with gr.TabItem('Blur', elem_id='haku_blur'):
blur_slider = gr.Slider(0, 32, 8, label="blur")
blur_btn = gr.Button("refresh", variant="primary")
with gr.TabItem('Sketch', elem_id='haku_sketch'):
sk_sigma = gr.Slider(1, 5, 1.4, step=0.05, label='sigma')
sk_k_sigma = gr.Slider(1, 5, 1.6, step=0.05, label='k_sigma')
sk_eps = gr.Slider(-0.2, 0.2, -0.03, step=0.005, label='epsilon')
sk_phi = gr.Slider(1, 50, 10, step=1, label='phi')
sk_gamma = gr.Slider(0.75, 1, 1, step=0.005, label='gamma')
sk_color = gr.Radio(['gray', 'rgb'], value='gray', label='color mode')
sk_scale = gr.Checkbox(False, label='use scale')
sketch_btn = gr.Button("refresh", variant="primary")
with gr.TabItem('Pixelize', elem_id='haku_Pixelize'):
p_colors = gr.Slider(2, 128, 16, step=1, label='colors')
p_dot_size = gr.Slider(2, 32, 8, step=1, label='dot size')
p_outline = gr.Slider(0, 10, 5, step=1, label='outline inflating')
p_smooth = gr.Slider(0, 10, 0, step=1, label='Smoothing')
pixel_btn = gr.Button("refresh", variant="primary")
with gr.TabItem('Other'):
img_other_h_slider = gr.Slider(160, 1280, 320, step=10, label="Image preview height", elem_id='haku_img_h_oth')
image_other = gr.Image(type='numpy', label="img", elem_id='haku_img_other', show_label=False)
with gr.Tabs(elem_id='function list'):
with gr.TabItem('InOutPaint'):
iop_u = gr.Slider(0, 512, 0, step=64, label='fill up')
iop_d = gr.Slider(0, 512, 0, step=64, label='fill down')
iop_l = gr.Slider(0, 512, 0, step=64, label='fill left')
iop_r = gr.Slider(0, 512, 0, step=64, label='fill right')
iop_btn = gr.Button("refresh", variant="primary")
with gr.Column():
img_out_h_slider = gr.Slider(160, 1280, 420, step=10, label="Image preview height", elem_id='haku_img_h_out')
res_info = gr.Textbox(label='Resolution')
image_out = gr.Image(
interactive=False,
type='pil',
label="haku_output",
elem_id='haku_out'
)
image_mask = gr.Image(visible=False)
with gr.Row():
send_btns = gpc.create_buttons(["img2img", "inpaint", "extras"])
send_ip_b = gr.Button("Send to inpaint upload", elem_id='send_inpaint_base')
with gr.Row():
with gr.Accordion('Send to Blend', open=False):
send_blends = []
for i in range(1, layers+1):
send_blends.append(gr.Button(f"Send to Layer{i}", elem_id=f'send_haku_blend{i}'))
send_eff = gr.Button("Send to Effect", elem_id='send_haku_blur')
#preview height slider
img_blend_h_slider.change(None, img_blend_h_slider, _js=f'get_change_height("haku_img_blend")')
img_eff_h_slider.change(None, img_eff_h_slider, _js=f'get_change_height("haku_img_eff")')
img_other_h_slider.change(None, img_other_h_slider, _js=f'get_change_height("haku_img_other")')
img_out_h_slider.change(None, img_out_h_slider, _js=f'get_change_height("haku_out")')
# blend
all_blend_set = [bg_color]
all_blend_set += all_alphas+all_mask_blur+all_mask_str
all_blend_input = all_blend_set + all_layers
for component in all_blend_set:
component.change(blend.run(layers), all_blend_input, image_out)
expand_btn.click(blend.run(layers), all_blend_input, image_out)
#blur
all_blur_input = [image_eff, blur_slider]
blur_slider.change(blur.run, all_blur_input, outputs=image_out)
blur_btn.click(blur.run, all_blur_input, outputs=image_out)
#color
all_color_set = [
bright_slider, contrast_slider, sat_slider,
temp_slider, hue_slider, gamma_slider
]
all_color_input = [image_eff] + all_color_set
for component in all_color_set:
component.change(color.run, all_color_input, image_out)
color_btn.click(color.run, all_color_input, image_out)
#sketch
all_sk_set = [
sk_sigma, sk_k_sigma, sk_eps, sk_phi, sk_gamma, sk_color, sk_scale
]
all_sk_input = [image_eff] + all_sk_set
for component in all_sk_set:
component.change(sketch.run, all_sk_input, image_out)
sketch_btn.click(sketch.run, all_sk_input, image_out)
#pixelize
all_p_set = [
p_colors, p_dot_size, p_smooth, p_outline
]
all_p_input = [image_eff] + all_p_set
for component in all_p_set:
component.change(pixel.run, all_p_input, image_out)
pixel_btn.click(pixel.run, all_p_input, image_out)
#iop
all_iop_set = [
iop_u, iop_d, iop_l, iop_r
]
all_iop_input = [image_other] + all_iop_set
for component in all_iop_set:
component.change(outpaint.run, all_iop_input, [image_out, image_mask])
iop_btn.click(outpaint.run, all_iop_input, [image_out, image_mask])
#
image_out.change(lambda x:f'{x.width} x {x.height}', image_out, res_info)
#send
for btns, btn3, img_src in all_btns:
for btn, img in zip(btns, all_layers):
btn.click(gpc.image_from_url_text, img_src, img, _js="extract_image_from_gallery")
btn3.click(gpc.image_from_url_text, img_src, image_eff, _js="extract_image_from_gallery")
gpc.bind_buttons(send_btns, image_out, None)
for btn, img in zip(btns, all_layers):
btn.click(lambda x:x, image_out, img)
btn.click(None, _js = 'switch_to_haku_blend')
for layer, send_btn in zip(all_layers, send_blends):
send_btn.click(lambda x:x, image_out, layer)
send_btn.click(None, _js='switch_to_haku_blend')
send_ip_b.click(lambda *x:x, [image_out, image_mask], [inpaint_base, inpaint_mask])
send_ip_b.click(None, _js = 'switch_to_inpaint_upload')
send_eff.click(lambda x:x, image_out, image_eff)
send_eff.click(None, _js = 'switch_to_haku_eff')
return (demo , "HakuImg", "haku_img"),
script_callbacks.on_ui_tabs(add_tab)