dikdimon's picture
Upload extensions using SD-Hub extension
3dabe4a verified
import gradio as gr
from PIL import Image
def calculate_ratio(image, shorter_side_length: int):
width, height = image.size
if width < height:
new_width = shorter_side_length
new_height = int(shorter_side_length * height / width)
else:
new_height = shorter_side_length
new_width = int(shorter_side_length * width / height)
return new_width, new_height
def calculate_pixel_ratios(image:Image.Image):
"""
Calculates required ratio (with respecting original aspect ratio) to match pixel count
"""
results = []
original_pixel_count = image.size[0] * image.size[1]
for pixel_counts in [768**2, 1024**2]:
ratio_to_divide_squared = original_pixel_count / pixel_counts
ratio_to_divide = ratio_to_divide_squared ** 0.5
new_width = int(image.size[0] / ratio_to_divide)
new_height = int(image.size[1] / ratio_to_divide)
results.append(f"{new_width} x {new_height} ({pixel_counts} pixels) (matched for {int(pixel_counts**0.5)} pixels)")
return results
def calculate_ratios(image):
results = []
for side_length in [512, 768, 896]:
new_width, new_height = calculate_ratio(image, side_length)
shorter_side = min(new_width, new_height)
longer_side = max(new_width, new_height)
ratio = longer_side / shorter_side
# get 1:x or x:1 ratio
if new_width == shorter_side:
ratio_str = f"1:{ratio}"
else:
ratio_str = f"{ratio}:1"
results.append(f"{new_width} x {new_height} ({ratio_str})")
return results
def calculate_and_concat_ratios(image):
r1 = calculate_ratios(image)
r2 = calculate_pixel_ratios(image)
return r1 + r2
def on_ui_tab_called():
with gr.Blocks() as calculator_interface:
with gr.Row():
image = gr.Image(type="pil",source="upload")
ratio_results_512 = gr.Textbox(lines=1, label="Results for 512")
ratio_results_768 = gr.Textbox(lines=1, label="Results for 768")
ratio_results_1024 = gr.Textbox(lines=1, label="Results for 1024")
pixel_ratio_result_768 = gr.Textbox(lines=1, label="Pixel Ratios for 768**2")
pixel_ratio_result_1024 = gr.Textbox(lines=1, label="Pixel Ratios for 1024**2")
#button = gr.Button(text="Calculate")
image.upload(
fn=calculate_and_concat_ratios,
inputs=[image],
outputs=[ratio_results_512, ratio_results_768, ratio_results_1024, pixel_ratio_result_768, pixel_ratio_result_1024]
)
return (calculator_interface, "calculator", "calculator_interface"),
try:
from modules import script_callbacks, postprocessing
script_callbacks.on_ui_tabs(on_ui_tab_called)
except (ImportError, ModuleNotFoundError):
# context not in webui, run as separate script
if __name__ == "__main__":
interface, _, _ = on_ui_tab_called()[0]
interface.launch()