Spaces:
Sleeping
Sleeping
File size: 3,816 Bytes
0ff586f ec2b558 124faa0 0ff586f ec2b558 0ff586f ec2b558 ce3eb76 0ff586f 124faa0 6f654f0 a20a37c 0ff586f a20a37c 6f654f0 0ff586f a20a37c 0ff586f 5eb76a8 0ff586f ad374a0 6bbb984 28b8faf 6bbb984 0ff586f eeb03e9 0ff586f a20a37c 0ff586f eeb03e9 |
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 90 91 92 93 94 95 96 |
import gradio as gr
import cv2
import numpy as np
from PIL import Image
def hex_to_rgb(hex_code):
# Remove the '#' symbol if present
hex_code = hex_code.lstrip('#')
# Convert the hex code to RGB
return tuple(int(hex_code[i:i+2], 16) for i in (0, 2, 4))
def crop_image(image, crop_top_percentage, crop_bottom_percentage):
height, width = image.shape[:2]
# Calculate the number of pixels to crop from the top and bottom as a percentage of the image height
crop_top = int(height * crop_top_percentage / 100)
crop_bottom = int(height * crop_bottom_percentage / 100)
# Crop the input image
cropped_image = image[crop_top:height - crop_bottom, :]
return cropped_image
def resize_and_overlay_image(input_image, reduction_percentage, shift_percentage_lr, shift_percentage_ud, background_color, crop_top_percentage, crop_bottom_percentage):
# Check if the input image is empty
if input_image.size == 0:
return None
img = np.array(input_image)
# Check if the image has shape information
if img.ndim < 2:
return None
# Crop the input image
cropped_img = crop_image(img, crop_top_percentage, crop_bottom_percentage)
# Get the dimensions of the cropped image
height, width = cropped_img.shape[:2]
# Calculate the new dimensions based on the reduction percentage
new_height = int(height * reduction_percentage / 100)
new_width = int(width * reduction_percentage / 100)
# Calculate the shift values as a percentage of the image dimensions
shift_x = int(width * shift_percentage_lr / 100)
shift_y = int(height * shift_percentage_ud / 100)
# Create a new background image with the same dimensions as the input image and specified color
background_rgb = hex_to_rgb(background_color)
background_img = np.ones_like(img) * background_rgb
# Resize the cropped image while maintaining aspect ratio
aspect_ratio = width / height
if new_width / new_height > aspect_ratio:
resized_height = new_height
resized_width = int(new_height * aspect_ratio)
else:
resized_width = new_width
resized_height = int(new_width / aspect_ratio)
resized_img = cv2.resize(cropped_img, (resized_width, resized_height))
# Calculate the position to overlay the resized image on the background image
x = int((width - resized_width) / 2) + shift_x
y = int((height - resized_height) / 2) + shift_y
# Overlay the resized image on the background image
background_img[y:y + resized_height, x:x + resized_width] = resized_img
# Return the resulting image as a NumPy array
return background_img, f"Input Image Dimensions: {width}x{height}"
# Create the Gradio interface
iface = gr.Interface(
fn=resize_and_overlay_image,
inputs=[
gr.inputs.Image(type="pil", label="Input Image"),
gr.inputs.Slider(minimum=0, maximum=100, step=10, default=80, label="Percentage of Original"),
gr.inputs.Slider(minimum=-50, maximum=50, step=10, default=0, label="Shift Left / Right (%)"),
gr.inputs.Slider(minimum=-50, maximum=50, step=10, default=0, label="Shift Up / Down (%)"),
gr.inputs.Textbox(default="#ffffff", label="Background Color (Hex Code)"),
gr.inputs.Slider(minimum=0, maximum=100, step=10, default=0, label="Crop Top (%)"),
gr.inputs.Slider(minimum=0, maximum=100, step=10, default=0, label="Crop Bottom (%)")
],
outputs=[
gr.outputs.Image(type="numpy", label="Result"),
gr.outputs.Textbox(label="Image Info")
],
title="Image Resizer",
description="Crop the input image, overlay it on a new background of the specified color, start centered, and shift it as a percentage without stretching."
)
if __name__ == "__main__":
iface.launch()
|