Spaces:
Running
Running
from PIL import Image | |
import gradio as gr | |
def resize_to_same_height(img1, img2): | |
target_height = min(img1.height, img2.height) | |
def resize(img): | |
aspect_ratio = img.width / img.height | |
new_width = int(target_height * aspect_ratio) | |
return img.resize((new_width, target_height), Image.LANCZOS) | |
return resize(img1), resize(img2) | |
def resize_to_same_width(img1, img2): | |
target_width = min(img1.width, img2.width) | |
def resize(img): | |
aspect_ratio = img.height / img.width | |
new_height = int(target_width * aspect_ratio) | |
return img.resize((target_width, new_height), Image.LANCZOS) | |
return resize(img1), resize(img2) | |
def natural_collage(img1, img2, layout="Horizontal"): | |
img1 = img1.convert("RGB") | |
img2 = img2.convert("RGB") | |
if layout == "Horizontal": | |
img1_resized, img2_resized = resize_to_same_height(img1, img2) | |
total_width = img1_resized.width + img2_resized.width | |
height = img1_resized.height | |
collage = Image.new("RGB", (total_width, height)) | |
collage.paste(img1_resized, (0, 0)) | |
collage.paste(img2_resized, (img1_resized.width, 0)) | |
else: | |
img1_resized, img2_resized = resize_to_same_width(img1, img2) | |
total_height = img1_resized.height + img2_resized.height | |
width = img1_resized.width | |
collage = Image.new("RGB", (width, total_height)) | |
collage.paste(img1_resized, (0, 0)) | |
collage.paste(img2_resized, (0, img1_resized.height)) | |
return collage | |
demo = gr.Interface( | |
fn=natural_collage, | |
inputs=[ | |
gr.Image(type="pil", label="First Image"), | |
gr.Image(type="pil", label="Second Image"), | |
gr.Radio(["Horizontal", "Vertical"], label="Layout") | |
], | |
outputs=gr.Image(label="Smart Collage"), | |
title="Mobile-style Collage App", | |
description="Creates seamless collage like Redmi Film Roll, preserving full image, with no padding or cropping." | |
) | |
if __name__ == "__main__": | |
demo.launch() | |