@ -1,6 +1,4 @@
import base64
import html
import io
import json
import math
import mimetypes
@ -18,13 +16,8 @@ import gradio as gr
import gradio . routes
import gradio . utils
import numpy as np
import piexif
import torch
from PIL import Image , PngImagePlugin
import gradio as gr
import gradio . utils
import gradio . routes
from modules import sd_hijack , sd_models , localization , script_callbacks
from modules . paths import script_path
@ -35,7 +28,7 @@ if cmd_opts.deepdanbooru:
from modules . deepbooru import get_deepbooru_tags
import modules . codeformer_model
import modules . generation_parameters_copypaste
import modules . generation_parameters_copypaste as parameters_copypaste
import modules . gfpgan_model
import modules . hypernetworks . ui
import modules . ldsr_model
@ -49,13 +42,11 @@ from modules.sd_hijack import model_hijack
from modules . sd_samplers import samplers , samplers_for_img2img
import modules . textual_inversion . ui
import modules . hypernetworks . ui
from modules . generation_parameters_copypaste import image_from_url_text
# this is a fix for Windows users. Without it, javascript files will be served with text/html content-type and the browser will not show any UI
mimetypes . init ( )
mimetypes . add_type ( ' application/javascript ' , ' .js ' )
txt2img_paste_fields = [ ]
img2img_paste_fields = [ ]
if not cmd_opts . share and not cmd_opts . listen :
# fix gradio phoning home
@ -98,37 +89,11 @@ def plaintext_to_html(text):
text = " <p> " + " <br> \n " . join ( [ f " { html . escape ( x ) } " for x in text . split ( ' \n ' ) ] ) + " </p> "
return text
def image_from_url_text ( filedata ) :
if type ( filedata ) == dict and filedata [ " is_file " ] :
filename = filedata [ " name " ]
tempdir = os . path . normpath ( tempfile . gettempdir ( ) )
normfn = os . path . normpath ( filename )
assert normfn . startswith ( tempdir ) , ' trying to open image file not in temporary directory '
return Image . open ( filename )
if type ( filedata ) == list :
if len ( filedata ) == 0 :
return None
filedata = filedata [ 0 ]
if filedata . startswith ( " data:image/png;base64, " ) :
filedata = filedata [ len ( " data:image/png;base64, " ) : ]
filedata = base64 . decodebytes ( filedata . encode ( ' utf-8 ' ) )
image = Image . open ( io . BytesIO ( filedata ) )
return image
def send_gradio_gallery_to_image ( x ) :
if len ( x ) == 0 :
return None
return image_from_url_text ( x [ 0 ] )
def save_files ( js_data , images , do_make_zip , index ) :
import csv
filenames = [ ]
@ -192,7 +157,6 @@ def save_files(js_data, images, do_make_zip, index):
return gr . File . update ( value = fullfns , visible = True ) , ' ' , ' ' , plaintext_to_html ( f " Saved: { filenames [ 0 ] } " )
def save_pil_to_file ( pil_image , dir = None ) :
use_metadata = False
metadata = PngImagePlugin . PngInfo ( )
@ -625,6 +589,82 @@ def create_refresh_button(refresh_component, refresh_method, refreshed_args, ele
)
return refresh_button
def create_output_panel ( tabname , outdir ) :
def open_folder ( f ) :
if not os . path . exists ( f ) :
print ( f ' Folder " { f } " does not exist. After you create an image, the folder will be created. ' )
return
elif not os . path . isdir ( f ) :
print ( f """
WARNING
An open_folder request was made with an argument that is not a folder .
This could be an error or a malicious attempt to run code on your computer .
Requested path was : { f }
""" , file=sys.stderr)
return
if not shared . cmd_opts . hide_ui_dir_config :
path = os . path . normpath ( f )
if platform . system ( ) == " Windows " :
os . startfile ( path )
elif platform . system ( ) == " Darwin " :
sp . Popen ( [ " open " , path ] )
else :
sp . Popen ( [ " xdg-open " , path ] )
with gr . Column ( variant = ' panel ' ) :
with gr . Group ( ) :
result_gallery = gr . Gallery ( label = ' Output ' , show_label = False , elem_id = f " { tabname } _gallery " ) . style ( grid = 4 )
generation_info = None
with gr . Column ( ) :
with gr . Row ( ) :
if tabname != " extras " :
save = gr . Button ( ' Save ' )
buttons = parameters_copypaste . create_buttons ( [ " img2img " , " inpaint " , " extras " ] )
button_id = " hidden_element " if shared . cmd_opts . hide_ui_dir_config else ' open_folder '
open_folder_button = gr . Button ( folder_symbol , elem_id = button_id )
open_folder_button . click (
fn = lambda : open_folder ( opts . outdir_samples or outdir ) ,
inputs = [ ] ,
outputs = [ ] ,
)
if tabname != " extras " :
with gr . Row ( ) :
do_make_zip = gr . Checkbox ( label = " Make Zip when Save? " , value = False )
with gr . Row ( ) :
download_files = gr . File ( None , file_count = " multiple " , interactive = False , show_label = False , visible = False )
with gr . Group ( ) :
html_info = gr . HTML ( )
generation_info = gr . Textbox ( visible = False )
save . click (
fn = wrap_gradio_call ( save_files ) ,
_js = " (x, y, z, w) => [x, y, z, selected_gallery_index()] " ,
inputs = [
generation_info ,
result_gallery ,
do_make_zip ,
html_info ,
] ,
outputs = [
download_files ,
html_info ,
html_info ,
html_info ,
]
)
else :
html_info_x = gr . HTML ( )
html_info = gr . HTML ( )
parameters_copypaste . bind_buttons ( buttons , result_gallery , " txt2img " if tabname == " txt2img " else None )
return result_gallery , generation_info if tabname != " extras " else html_info_x , html_info
def create_ui ( wrap_gradio_gpu_call ) :
import modules . img2img
@ -675,30 +715,9 @@ def create_ui(wrap_gradio_gpu_call):
with gr . Group ( ) :
custom_inputs = modules . scripts . scripts_txt2img . setup_ui ( is_img2img = False )
with gr . Column ( variant = ' panel ' ) :
with gr . Group ( ) :
txt2img_preview = gr . Image ( elem_id = ' txt2img_preview ' , visible = False )
txt2img_gallery = gr . Gallery ( label = ' Output ' , show_label = False , elem_id = ' txt2img_gallery ' ) . style ( grid = 4 )
with gr . Column ( ) :
with gr . Row ( ) :
save = gr . Button ( ' Save ' )
send_to_img2img = gr . Button ( ' Send to img2img ' )
send_to_inpaint = gr . Button ( ' Send to inpaint ' )
send_to_extras = gr . Button ( ' Send to extras ' )
button_id = " hidden_element " if shared . cmd_opts . hide_ui_dir_config else ' open_folder '
open_txt2img_folder = gr . Button ( folder_symbol , elem_id = button_id )
with gr . Row ( ) :
do_make_zip = gr . Checkbox ( label = " Make Zip when Save? " , value = False )
with gr . Row ( ) :
download_files = gr . File ( None , file_count = " multiple " , interactive = False , show_label = False , visible = False )
with gr . Group ( ) :
html_info = gr . HTML ( )
generation_info = gr . Textbox ( visible = False )
txt2img_gallery , generation_info , html_info = create_output_panel ( " txt2img " , opts . outdir_txt2img_samples )
connect_reuse_seed ( seed , reuse_seed , generation_info , dummy_component , is_subseed = False )
connect_reuse_seed ( subseed , reuse_subseed , generation_info , dummy_component , is_subseed = True )
@ -756,23 +775,6 @@ def create_ui(wrap_gradio_gpu_call):
outputs = [ hr_options ] ,
)
save . click (
fn = wrap_gradio_call ( save_files ) ,
_js = " (x, y, z, w) => [x, y, z, selected_gallery_index()] " ,
inputs = [
generation_info ,
txt2img_gallery ,
do_make_zip ,
html_info ,
] ,
outputs = [
download_files ,
html_info ,
html_info ,
html_info ,
]
)
roll . click (
fn = roll_artist ,
_js = " update_txt2img_tokens " ,
@ -784,8 +786,7 @@ def create_ui(wrap_gradio_gpu_call):
]
)
global txt2img_paste_fields
txt2img_paste_fields = [
parameters_copypaste . add_paste_fields ( " txt2img " , None , [
( txt2img_prompt , " Prompt " ) ,
( txt2img_negative_prompt , " Negative prompt " ) ,
( steps , " Steps " ) ,
@ -806,7 +807,7 @@ def create_ui(wrap_gradio_gpu_call):
( firstphase_width , " First pass size-1 " ) ,
( firstphase_height , " First pass size-2 " ) ,
* modules . scripts . scripts_txt2img . infotext_fields
]
] )
txt2img_preview_params = [
txt2img_prompt ,
@ -893,30 +894,7 @@ def create_ui(wrap_gradio_gpu_call):
with gr . Group ( ) :
custom_inputs = modules . scripts . scripts_img2img . setup_ui ( is_img2img = True )
with gr . Column ( variant = ' panel ' ) :
with gr . Group ( ) :
img2img_preview = gr . Image ( elem_id = ' img2img_preview ' , visible = False )
img2img_gallery = gr . Gallery ( label = ' Output ' , show_label = False , elem_id = ' img2img_gallery ' ) . style ( grid = 4 )
with gr . Column ( ) :
with gr . Row ( ) :
save = gr . Button ( ' Save ' )
img2img_send_to_img2img = gr . Button ( ' Send to img2img ' )
img2img_send_to_inpaint = gr . Button ( ' Send to inpaint ' )
img2img_send_to_extras = gr . Button ( ' Send to extras ' )
button_id = " hidden_element " if shared . cmd_opts . hide_ui_dir_config else ' open_folder '
open_img2img_folder = gr . Button ( folder_symbol , elem_id = button_id )
with gr . Row ( ) :
do_make_zip = gr . Checkbox ( label = " Make Zip when Save? " , value = False )
with gr . Row ( ) :
download_files = gr . File ( None , file_count = " multiple " , interactive = False , show_label = False , visible = False )
with gr . Group ( ) :
html_info = gr . HTML ( )
generation_info = gr . Textbox ( visible = False )
img2img_gallery , generation_info , html_info = create_output_panel ( " img2img " , opts . outdir_img2img_samples )
connect_reuse_seed ( seed , reuse_seed , generation_info , dummy_component , is_subseed = False )
connect_reuse_seed ( subseed , reuse_subseed , generation_info , dummy_component , is_subseed = True )
@ -1003,25 +981,9 @@ def create_ui(wrap_gradio_gpu_call):
fn = interrogate_deepbooru ,
inputs = [ init_img ] ,
outputs = [ img2img_prompt ] ,
)
save . click (
fn = wrap_gradio_call ( save_files ) ,
_js = " (x, y, z, w) => [x, y, z, selected_gallery_index()] " ,
inputs = [
generation_info ,
img2img_gallery ,
do_make_zip ,
html_info ,
] ,
outputs = [
download_files ,
html_info ,
html_info ,
html_info ,
]
)
roll . click (
fn = roll_artist ,
_js = " update_img2img_tokens " ,
@ -1055,7 +1017,8 @@ def create_ui(wrap_gradio_gpu_call):
outputs = [ prompt , negative_prompt , style1 , style2 ] ,
)
global img2img_paste_fields
token_button . click ( fn = update_token_counter , inputs = [ img2img_prompt , steps ] , outputs = [ token_counter ] )
img2img_paste_fields = [
( img2img_prompt , " Prompt " ) ,
( img2img_negative_prompt , " Negative prompt " ) ,
@ -1074,7 +1037,9 @@ def create_ui(wrap_gradio_gpu_call):
( denoising_strength , " Denoising strength " ) ,
* modules . scripts . scripts_img2img . infotext_fields
]
token_button . click ( fn = update_token_counter , inputs = [ img2img_prompt , steps ] , outputs = [ token_counter ] )
parameters_copypaste . add_paste_fields ( " img2img " , init_img , img2img_paste_fields )
parameters_copypaste . add_paste_fields ( " inpaint " , init_img_with_mask , img2img_paste_fields )
with gr . Blocks ( analytics_enabled = False ) as extras_interface :
with gr . Row ( ) . style ( equal_height = False ) :
@ -1124,15 +1089,8 @@ def create_ui(wrap_gradio_gpu_call):
submit = gr . Button ( ' Generate ' , elem_id = " extras_generate " , variant = ' primary ' )
with gr . Column ( variant = ' panel ' ) :
result_images = gr . Gallery ( label = " Result " , show_label = False )
html_info_x = gr . HTML ( )
html_info = gr . HTML ( )
extras_send_to_img2img = gr . Button ( ' Send to img2img ' )
extras_send_to_inpaint = gr . Button ( ' Send to inpaint ' )
button_id = " hidden_element " if shared . cmd_opts . hide_ui_dir_config else ' '
open_extras_folder = gr . Button ( ' Open output directory ' , elem_id = button_id )
result_images , html_info_x , html_info = create_output_panel ( " extras " , opts . outdir_extras_samples )
submit . click (
fn = wrap_gradio_gpu_call ( modules . extras . run_extras ) ,
@ -1163,20 +1121,8 @@ def create_ui(wrap_gradio_gpu_call):
html_info ,
]
)
parameters_copypaste . add_paste_fields ( " extras " , extras_image , None )
extras_send_to_img2img . click (
fn = lambda x : image_from_url_text ( x ) ,
_js = " extract_image_from_gallery_img2img " ,
inputs = [ result_images ] ,
outputs = [ init_img ] ,
)
extras_send_to_inpaint . click (
fn = lambda x : image_from_url_text ( x ) ,
_js = " extract_image_from_gallery_inpaint " ,
inputs = [ result_images ] ,
outputs = [ init_img_with_mask ] ,
)
extras_image . change (
fn = modules . extras . clear_cache ,
@ -1192,10 +1138,9 @@ def create_ui(wrap_gradio_gpu_call):
html = gr . HTML ( )
generation_info = gr . Textbox ( visible = False )
html2 = gr . HTML ( )
with gr . Row ( ) :
pnginfo_send_to_txt2img = gr . Button ( ' Send to txt2img ' )
pnginfo_send_to_img2img = gr . Button ( ' Send to img2img ' )
buttons = parameters_copypaste . create_buttons ( [ " txt2img " , " img2img " , " inpaint " , " extras " ] )
parameters_copypaste . bind_buttons ( buttons , image , generation_info )
image . change (
fn = wrap_gradio_call ( modules . extras . run_pnginfo ) ,
@ -1500,28 +1445,6 @@ def create_ui(wrap_gradio_gpu_call):
script_callbacks . ui_settings_callback ( )
opts . reorder ( )
def open_folder ( f ) :
if not os . path . exists ( f ) :
print ( f ' Folder " { f } " does not exist. After you create an image, the folder will be created. ' )
return
elif not os . path . isdir ( f ) :
print ( f """
WARNING
An open_folder request was made with an argument that is not a folder .
This could be an error or a malicious attempt to run code on your computer .
Requested path was : { f }
""" , file=sys.stderr)
return
if not shared . cmd_opts . hide_ui_dir_config :
path = os . path . normpath ( f )
if platform . system ( ) == " Windows " :
os . startfile ( path )
elif platform . system ( ) == " Darwin " :
sp . Popen ( [ " open " , path ] )
else :
sp . Popen ( [ " xdg-open " , path ] )
def run_settings ( * args ) :
changed = 0
@ -1666,6 +1589,9 @@ Requested path was: {f}
if column is not None :
column . __exit__ ( )
interfaces = [
( txt2img_interface , " txt2img " , " txt2img " ) ,
( img2img_interface , " img2img " , " img2img " ) ,
@ -1756,68 +1682,7 @@ Requested path was: {f}
component_dict [ ' sd_model_checkpoint ' ] ,
]
)
paste_field_names = [ ' Prompt ' , ' Negative prompt ' , ' Steps ' , ' Face restoration ' , ' Seed ' , ' Size-1 ' , ' Size-2 ' ]
txt2img_fields = [ field for field , name in txt2img_paste_fields if name in paste_field_names ]
img2img_fields = [ field for field , name in img2img_paste_fields if name in paste_field_names ]
send_to_img2img . click (
fn = lambda img , * args : ( image_from_url_text ( img ) , * args ) ,
_js = " (gallery, ...args) => [extract_image_from_gallery_img2img(gallery), ...args] " ,
inputs = [ txt2img_gallery ] + txt2img_fields ,
outputs = [ init_img ] + img2img_fields ,
)
send_to_inpaint . click (
fn = lambda x , * args : ( image_from_url_text ( x ) , * args ) ,
_js = " (gallery, ...args) => [extract_image_from_gallery_inpaint(gallery), ...args] " ,
inputs = [ txt2img_gallery ] + txt2img_fields ,
outputs = [ init_img_with_mask ] + img2img_fields ,
)
img2img_send_to_img2img . click (
fn = lambda x : image_from_url_text ( x ) ,
_js = " extract_image_from_gallery_img2img " ,
inputs = [ img2img_gallery ] ,
outputs = [ init_img ] ,
)
img2img_send_to_inpaint . click (
fn = lambda x : image_from_url_text ( x ) ,
_js = " extract_image_from_gallery_inpaint " ,
inputs = [ img2img_gallery ] ,
outputs = [ init_img_with_mask ] ,
)
send_to_extras . click (
fn = lambda x : image_from_url_text ( x ) ,
_js = " extract_image_from_gallery_extras " ,
inputs = [ txt2img_gallery ] ,
outputs = [ extras_image ] ,
)
open_txt2img_folder . click (
fn = lambda : open_folder ( opts . outdir_samples or opts . outdir_txt2img_samples ) ,
inputs = [ ] ,
outputs = [ ] ,
)
open_img2img_folder . click (
fn = lambda : open_folder ( opts . outdir_samples or opts . outdir_img2img_samples ) ,
inputs = [ ] ,
outputs = [ ] ,
)
open_extras_folder . click (
fn = lambda : open_folder ( opts . outdir_samples or opts . outdir_extras_samples ) ,
inputs = [ ] ,
outputs = [ ] ,
)
img2img_send_to_extras . click (
fn = lambda x : image_from_url_text ( x ) ,
_js = " extract_image_from_gallery_extras " ,
inputs = [ img2img_gallery ] ,
outputs = [ extras_image ] ,
)
settings_map = {
' sd_hypernetwork ' : ' Hypernet ' ,
@ -1825,16 +1690,7 @@ Requested path was: {f}
' sd_model_checkpoint ' : ' Model hash ' ,
}
settings_paste_fields = [
( component_dict [ k ] , lambda d , k = k , v = v : apply_setting ( k , d . get ( v , None ) ) )
for k , v in settings_map . items ( )
]
modules . generation_parameters_copypaste . connect_paste ( txt2img_paste , txt2img_paste_fields + settings_paste_fields , txt2img_prompt )
modules . generation_parameters_copypaste . connect_paste ( img2img_paste , img2img_paste_fields + settings_paste_fields , img2img_prompt )
modules . generation_parameters_copypaste . connect_paste ( pnginfo_send_to_txt2img , txt2img_paste_fields + settings_paste_fields , generation_info , ' switch_to_txt2img ' )
modules . generation_parameters_copypaste . connect_paste ( pnginfo_send_to_img2img , img2img_paste_fields + settings_paste_fields , generation_info , ' switch_to_img2img_img2img ' )
parameters_copypaste . run_bind ( )
ui_config_file = cmd_opts . ui_config_file
ui_settings = { }