Spaces:
Runtime error
Runtime error
import os | |
from pathlib import Path | |
from PIL import Image | |
import numpy as np | |
def crop(image_path, point, mode=0, size=(512, 512), box=None, face_ratio=2, shreshold=1.5): | |
img = Image.open(image_path) | |
img_width, img_height = img.size | |
tgt_width, tgt_height = size | |
point = (point[0]*img_width, point[1]*img_height) | |
# mode 0 : automatic | |
if mode == 0: | |
if box is None: | |
raise RuntimeError('face bax parameter expected: missing box=(width, height)') | |
if img_width < tgt_width or img_height < tgt_height: | |
mode = 1 | |
elif face_ratio ** 2 * shreshold ** 2 * box[0] * box[1] * img_width * img_height < tgt_width * tgt_height: | |
mode = 2 | |
else: | |
mode = 3 | |
# mode 1 : no scale | |
if mode == 1: | |
pass | |
# mode 2 : full screen - crop as largr as possible | |
if mode == 2: | |
if tgt_width/img_width > tgt_height/img_height: | |
r = tgt_height / tgt_width | |
tgt_width = img_width | |
tgt_height = round(tgt_width * r) | |
else: | |
r = tgt_width / tgt_height | |
tgt_height = img_height | |
tgt_width = round(tgt_height * r) | |
# mode 3 : fixed face ratio | |
if mode == 3: | |
if box is None: | |
raise RuntimeError('face bax parameter expected: missing box=(width, height)') | |
box_width = box[0] * img_height | |
box_height = box[1] * img_height | |
if box_width/tgt_width > box_height/tgt_width: | |
r = tgt_height / tgt_width | |
tgt_width = round(box_width * face_ratio) | |
tgt_height = round(tgt_width * r) | |
else: | |
r = tgt_width / tgt_height | |
tgt_height = round(box_height * face_ratio) | |
tgt_width = round(tgt_height * r) | |
# upscale raw image if target size is over raw image size | |
if img_width < tgt_width or img_height < tgt_height: | |
if img_width < img_height: | |
img_height = round(tgt_width * img_height / img_width) | |
img_width = tgt_width | |
img = img.resize((img_width, img_height)) | |
else: | |
img_width = round(tgt_height * img_width / img_height) | |
img_height = tgt_height | |
img = img.resize((img_width, img_height)) | |
left = point[0] - tgt_width // 2 | |
top = point[1] - tgt_height // 2 | |
right = point[0] + tgt_width // 2 | |
bottom = point[1] + tgt_height // 2 | |
if left < 0: | |
right -= left | |
left = 0 | |
if right > img_width: | |
left -= (right-img_width) | |
right = img_width | |
if top < 0: | |
bottom -= top | |
top = 0 | |
if bottom > img_height: | |
top -= (bottom-img_height) | |
bottom = img_height | |
cropped_img = img.crop((left, top, right, bottom)) | |
cropped_img = cropped_img.resize(size) | |
return cropped_img | |