mirror of
https://github.com/task-17-lct/backend.git
synced 2024-11-30 19:53:45 +03:00
76 lines
2.5 KiB
Python
76 lines
2.5 KiB
Python
import os
|
|
|
|
from io import BytesIO
|
|
from PIL import Image
|
|
|
|
from passfinder.users.models import User
|
|
|
|
|
|
def crop_image(image_path: str, length: int = 500):
|
|
"""Makes image's thumbnail bt given parameters. By default, crops to 500x500"""
|
|
image = Image.open(image_path)
|
|
blob = BytesIO()
|
|
|
|
try:
|
|
if image.size[0] < image.size[1]:
|
|
# The image is in portrait mode. Height is bigger than width.
|
|
|
|
# This makes the width fit the LENGTH in pixels while conserving the ration.
|
|
resized_image = image.resize(
|
|
(length, int(image.size[1] * (length / image.size[0])))
|
|
)
|
|
|
|
# Amount of pixel to lose in total on the height of the image.
|
|
required_loss = resized_image.size[1] - length
|
|
|
|
# Crop the height of the image so as to keep the center part.
|
|
resized_image = resized_image.crop(
|
|
box=(
|
|
0,
|
|
int(required_loss / 2),
|
|
length,
|
|
int(resized_image.size[1] - required_loss / 2),
|
|
)
|
|
)
|
|
else:
|
|
# This image is in landscape mode or already squared. The width is bigger than the heihgt.
|
|
|
|
# This makes the height fit the LENGTH in pixels while conserving the ration.
|
|
resized_image = image.resize(
|
|
(int(image.size[0] * (length / image.size[1])), length)
|
|
)
|
|
|
|
# Amount of pixel to lose in total on the width of the image.
|
|
required_loss = resized_image.size[0] - length
|
|
|
|
# Crop the width of the image so as to keep 1080 pixels of the center part.
|
|
resized_image = resized_image.crop(
|
|
box=(
|
|
int(required_loss / 2),
|
|
0,
|
|
int(resized_image.size[0] - required_loss / 2),
|
|
length,
|
|
)
|
|
)
|
|
resized_image.save(blob, "PNG")
|
|
except OSError:
|
|
print("Can't crop")
|
|
return blob
|
|
|
|
|
|
def user_file_upload_mixin(instance, filename):
|
|
"""stores user uploaded files at their folder in media dir"""
|
|
username = ""
|
|
if isinstance(instance, User):
|
|
username = instance.username
|
|
elif hasattr(instance, "user"):
|
|
username = instance.user.username
|
|
elif hasattr(instance, "creator"):
|
|
username = instance.creator.username
|
|
|
|
return os.path.join(f"uploads/{username}/", filename)
|
|
|
|
|
|
def get_filename(filename, request):
|
|
return filename.upper()
|