File size: 3,382 Bytes
b64541c
 
52ce05b
 
 
b64541c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
52ce05b
 
 
 
 
 
 
b64541c
52ce05b
 
9282482
52ce05b
9282482
 
 
 
52ce05b
 
9282482
52ce05b
3973a71
9282482
3973a71
 
9282482
3973a71
 
9282482
 
3973a71
9282482
3973a71
9282482
 
 
 
 
 
 
52ce05b
 
 
 
9282482
 
 
52ce05b
b64541c
52ce05b
b64541c
 
52ce05b
 
3973a71
52ce05b
b64541c
 
52ce05b
 
 
b64541c
 
 
 
52ce05b
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
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]
    new_width, new_height = target_size
    
    # Resize the image to maintain aspect ratio and fit within the half-height
    image.thumbnail((new_width, new_height // 2), PIL.Image.Resampling.LANCZOS)

    # Obtain the dominant color of the image
    dominant_color = get_dominant_color(image)
    
    # Create a new image with the dominant color as the background
    new_image = Image.new("RGB", target_size, dominant_color)

    # Size alignment for position: left, right, center, bottom, top
    if size_align == "Left":
        x_offset = 0
        y_offset = 0  # Place at the top
    elif size_align == "Right":
        x_offset = target_size[0] - image.width
        y_offset = 0  # Place at the top
    elif size_align == "Top":
        x_offset = (target_size[0] - image.width) // 2
        y_offset = 0  # Place at the top
    elif size_align == "Bottom":
        x_offset = (target_size[0] - image.width) // 2
        y_offset = (target_size[1] - image.height)  # Place at the bottom
    else:  # Center
        x_offset = (target_size[0] - image.width) // 2
        y_offset = 0  # Place at the top

    # Paste the resized image onto the new background
    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", "Top", "Bottom"], 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)