infinite-zoom-automatic1111.../iz_helpers/image.py

56 lines
1.9 KiB
Python

from PIL import Image
import requests
import base64
from io import BytesIO
def shrink_and_paste_on_blank(current_image, mask_width, mask_height):
"""
Decreases size of current_image by mask_width pixels from each side,
then adds a mask_width width transparent frame,
so that the image the function returns is the same size as the input.
:param current_image: input image to transform
:param mask_width: width in pixels to shrink from each side
:param mask_height: height in pixels to shrink from each side
"""
# calculate new dimensions
width, height = current_image.size
new_width = width - 2 * mask_width
new_height = height - 2 * mask_height
# resize and paste onto blank image
prev_image = current_image.resize((new_width, new_height))
blank_image = Image.new("RGBA", (width, height), (0, 0, 0, 1))
blank_image.paste(prev_image, (mask_width, mask_height))
return blank_image
def open_image(image_path):
if image_path.startswith('http'):
# If the image path is a URL, download the image using requests
response = requests.get(image_path)
img = Image.open(BytesIO(response.content))
elif image_path.startswith('data'):
# If the image path is a DataURL, decode the base64 string
encoded_data = image_path.split(',')[1]
decoded_data = base64.b64decode(encoded_data)
img = Image.open(BytesIO(decoded_data))
else:
# Assume that the image path is a file path
img = Image.open(image_path)
return img
def apply_alpha_mask(current_image, mask_image):
# Resize the mask to match the current image size
mask_image = mask_image.resize(current_image.size)
# Apply the mask as the alpha layer of the current image
result_image = current_image.copy()
result_image.putalpha(mask_image.convert('L')) # convert to grayscale
return result_image