dramp77's picture
change fit margin image
9365d5e
raw
history blame
2.69 kB
import gradio as gr
import PIL
from PIL import Image, ImageOps
from collections import Counter
import numpy as np
size_options ={"1200 x 1500": (1200, 1500),
"1200 x 1200": (1200, 1200),
"1200 x 628": (1200, 628),
"Meta - Square (Feed)": (1200, 1200),
"Meta - Story": (1080, 1920),
"Tiktok Pangle - 1280 x 720": (1280, 720),
"Tiktok Pangle - 1200 x 628": (1200, 628),
"Tiktok Pangle - 640 x 640": (640, 640),
"Tiktok Pangle - 300 x 250": (300, 250),
"Tiktok Pangle - 720 x 1280": (720, 1280),
"Tiktok Pangle - 300 x 50": (300, 50),
"Tiktok Pangle - 320 x 50": (320, 50),
"Tiktok Pangle - 320 x 480": (320, 480),
"Tiktok Pangle - 250 x 250": (250, 250),
"Tiktok Pangle - 600 x 770": (600, 770),
"Tiktok Pangle - 720 x 1067": (720, 1067),
"Tiktok Pangle - 480 x 320": (480, 320)}
def get_dominant_color(image):
image = image.resize((50, 50)) # Resize to speed up
pixels = np.array(image)
pixels = pixels.reshape((-1, 3))
counter = Counter(map(tuple, pixels))
dominant_color = counter.most_common(1)[0][0]
return dominant_color
def change_size(image, selected_size, size_align):
target_size = size_options[selected_size]
# Maintain aspect ratio without stretching
image.thumbnail(target_size, PIL.Image.Resampling.LANCZOS)
dominant_color = get_dominant_color(image)
new_image = Image.new("RGB", target_size, dominant_color)
# Calculate offset based on alignment choice
x_offset = (target_size[0] - image.width) // 2 if size_align == "Center" else 0 if size_align == "Left" else target_size[0] - image.width
y_offset = (target_size[1] - image.height) // 2 # this to keep the image on center
new_image.paste(image, (x_offset, y_offset))
return new_image
def gradio_interface():
with gr.Blocks() as demo:
gr.Markdown("# Advanced Image Resizer with Background and Margins")
with gr.Row():
image_input = gr.Image(type="pil", label="Upload Image")
size_input = gr.Dropdown(list(size_options.keys()), label="Size Options")
with gr.Row():
size_alignment = gr.Radio(["Left", "Center", "Right"], value="Center", label="Size Alignment")
image_output = gr.Image(type="pil", label="Resized Image with Background")
submit_button = gr.Button("Resize Image")
submit_button.click(fn=change_size,
inputs=[image_input, size_input, size_alignment],
outputs=image_output)
return demo
demo = gradio_interface()
demo.launch(share=True)