mirror of
https://github.com/sontungdo/sd-image-editor.git
synced 2026-01-26 11:19:44 +00:00
first version
This commit is contained in:
BIN
scripts/__pycache__/sd-image-editor.cpython-310.pyc
Normal file
BIN
scripts/__pycache__/sd-image-editor.cpython-310.pyc
Normal file
Binary file not shown.
173
scripts/sd-image-editor.py
Normal file
173
scripts/sd-image-editor.py
Normal file
@@ -0,0 +1,173 @@
|
||||
import gradio as gr
|
||||
import os
|
||||
import string
|
||||
|
||||
from modules import script_callbacks
|
||||
from modules.ui_components import ResizeHandleRow
|
||||
from modules import shared
|
||||
from modules.shared import opts, cmd_opts
|
||||
import modules.infotext_utils as parameters_copypaste
|
||||
|
||||
from PIL import Image, ImageEnhance, ImageFilter, ImageTransform
|
||||
|
||||
save_path = os.path.join("output", "img2img-images", "sd-image-editor")
|
||||
|
||||
def edit(img, degree, expand, flip, interpolate_mode, color, contrast, brightness, sharpness):
|
||||
# Flip
|
||||
if flip:
|
||||
img = img.transpose(method=Image.Transpose.FLIP_LEFT_RIGHT)
|
||||
# Rotate
|
||||
if interpolate_mode == "Nearest":
|
||||
resample_obj = Image.NEAREST
|
||||
elif interpolate_mode == "Bilinear":
|
||||
resample_obj = Image.BILINEAR
|
||||
elif interpolate_mode == "Bicubic":
|
||||
resample_obj = Image.BICUBIC
|
||||
img = img.rotate(-degree, expand=expand, resample=resample_obj) # Rotate closewise
|
||||
# Enhance
|
||||
img_enhance = ImageEnhance.Color(img)
|
||||
img = img_enhance.enhance(color)
|
||||
img_enhance = ImageEnhance.Contrast(img)
|
||||
img = img_enhance.enhance(contrast)
|
||||
img_enhance = ImageEnhance.Brightness(img)
|
||||
img = img_enhance.enhance(brightness)
|
||||
img_enhance = ImageEnhance.Sharpness(img)
|
||||
img = img_enhance.enhance(sharpness)
|
||||
return img
|
||||
|
||||
def save_image(img):
|
||||
from random import choices
|
||||
# Generate filename
|
||||
filename = ''.join(choices(string.ascii_letters + string.digits, k=12)) + ".png"
|
||||
# Construct path to save
|
||||
os.makedirs(save_path, exist_ok=True)
|
||||
# Save
|
||||
img.save(os.path.join(save_path, filename), format="PNG")
|
||||
return
|
||||
|
||||
def open_folder():
|
||||
os.makedirs(save_path, exist_ok=True)
|
||||
os.startfile(save_path)
|
||||
return
|
||||
|
||||
def on_ui_tabs():
|
||||
with gr.Blocks(analytics_enabled=False) as image_editor_interface:
|
||||
with ResizeHandleRow():
|
||||
with gr.Column():
|
||||
init_img = gr.Image(label="Image for editing",
|
||||
elem_id="image_editing",
|
||||
show_label=False,
|
||||
source="upload",
|
||||
interactive=True,
|
||||
type="pil",
|
||||
tool="editor",
|
||||
image_mode="RGBA",
|
||||
height=500)
|
||||
|
||||
with gr.TabItem('Transform', id='transform', elem_id="transform_tab") as tab_transform:
|
||||
with gr.Row():
|
||||
rotate_slider = gr.Slider(
|
||||
minimum=-180,
|
||||
maximum=180,
|
||||
step=5,
|
||||
value=0,
|
||||
label="Rotate"
|
||||
)
|
||||
rotate_expand_option = gr.Checkbox(
|
||||
True,
|
||||
label="Expand to fit"
|
||||
)
|
||||
flip_option = gr.Checkbox(
|
||||
False,
|
||||
label="Flip image"
|
||||
)
|
||||
with gr.Row():
|
||||
with gr.Accordion(label="Advanced", open=False):
|
||||
interpolation_options = gr.Radio(
|
||||
["Nearest", "Bilinear", "Bicubic"],
|
||||
value="Bicubic",
|
||||
label="Interpolation mode",
|
||||
info="in increasing order of quality (with performance cost)"
|
||||
)
|
||||
|
||||
with gr.TabItem('Adjust', id='adjust', elem_id="adjust_tab") as tab_adjust:
|
||||
with gr.Row():
|
||||
color_slider = gr.Slider(
|
||||
minimum=0,
|
||||
maximum=2,
|
||||
step=0.05,
|
||||
value=1,
|
||||
label="Color balance"
|
||||
)
|
||||
with gr.Row():
|
||||
contrast_slider = gr.Slider(
|
||||
minimum=0,
|
||||
maximum=2,
|
||||
step=0.05,
|
||||
value=1,
|
||||
label="Contrast"
|
||||
)
|
||||
with gr.Row():
|
||||
brightness_slider = gr.Slider(
|
||||
minimum=0,
|
||||
maximum=4,
|
||||
step=0.05,
|
||||
value=1,
|
||||
label="Brightness"
|
||||
)
|
||||
with gr.Row():
|
||||
sharpness_slider = gr.Slider(
|
||||
minimum=-2,
|
||||
maximum=4,
|
||||
step=0.1,
|
||||
value=1,
|
||||
label="Sharpness"
|
||||
)
|
||||
|
||||
with gr.Column():
|
||||
output_img = gr.Image(label="Output image",
|
||||
height=500,
|
||||
type="pil",
|
||||
interactive=False)
|
||||
with gr.Row():
|
||||
render_button = gr.Button(value="Render")
|
||||
with gr.Row():
|
||||
save_button = gr.Button(value="Save to img2img",
|
||||
variant="primary",
|
||||
scale=4)
|
||||
if os.name == "nt":
|
||||
folder_symbol = '\U0001f4c2' # 📂
|
||||
open_folder_button = gr.Button(value=folder_symbol,
|
||||
scale=1)
|
||||
|
||||
with gr.Row():
|
||||
buttons = parameters_copypaste.create_buttons(["img2img", "inpaint", "extras"])
|
||||
for tabname, button in buttons.items():
|
||||
parameters_copypaste.register_paste_params_button(parameters_copypaste.ParamBinding(
|
||||
paste_button=button, tabname=tabname, source_image_component=output_img,
|
||||
))
|
||||
|
||||
|
||||
control_inputs = [rotate_slider, rotate_expand_option, flip_option, interpolation_options, color_slider,\
|
||||
contrast_slider, brightness_slider, sharpness_slider]
|
||||
|
||||
# Event listeners for all editing options
|
||||
|
||||
init_img.upload(edit, inputs=[init_img, *control_inputs], outputs=[output_img])
|
||||
render_button.click(edit, inputs=[init_img, *control_inputs], outputs=[output_img])
|
||||
save_button.click(save_image, inputs=[output_img], outputs=[])
|
||||
open_folder_button.click(open_folder, inputs=[], outputs=[])
|
||||
|
||||
rotate_slider.release(edit, inputs=[init_img, *control_inputs], outputs=[output_img])
|
||||
rotate_expand_option.select(edit, inputs=[init_img, *control_inputs], outputs=[output_img])
|
||||
flip_option.select(edit, inputs=[init_img, *control_inputs], outputs=[output_img])
|
||||
interpolation_options.select(edit, inputs=[init_img, *control_inputs], outputs=[output_img])
|
||||
color_slider.release(edit, inputs=[init_img, *control_inputs], outputs=[output_img])
|
||||
contrast_slider.release(edit, inputs=[init_img, *control_inputs], outputs=[output_img])
|
||||
brightness_slider.release(edit, inputs=[init_img, *control_inputs], outputs=[output_img])
|
||||
sharpness_slider.release(edit, inputs=[init_img, *control_inputs], outputs=[output_img])
|
||||
|
||||
return [(image_editor_interface, "Image Editor", "image_editor_tab")]
|
||||
|
||||
|
||||
script_callbacks.on_ui_tabs(on_ui_tabs)
|
||||
Reference in New Issue
Block a user