| import pathlib
|
|
|
| import cv2
|
| import numpy as np
|
| from PIL import Image
|
|
|
|
|
| def img_write_to_bytes(array, fmt: str = '.png') -> bytes:
|
| return cv2.imencode(fmt, array)[1].tobytes()
|
|
|
|
|
| def img_read(input_file: pathlib.Path, flags: int = cv2.IMREAD_COLOR):
|
| return cv2.imdecode(np.fromfile(input_file, np.uint8), flags)
|
|
|
|
|
| def downscale_image(img, max_width):
|
|
|
| width, height = img.size
|
|
|
|
|
| if width <= max_width:
|
| return img
|
|
|
|
|
| new_height = int((max_width / width) * height)
|
|
|
|
|
| img_resized = img.resize((max_width, new_height), Image.Resampling.LANCZOS)
|
|
|
| return img_resized
|
|
|
|
|
| def downscale_and_compress_from_path(
|
| old_path: pathlib.Path,
|
| new_path: pathlib.Path,
|
| max_width: int = 500,
|
| quality: int = 80,
|
| ):
|
|
|
| img = Image.open(old_path)
|
| img = downscale_image(img, max_width=max_width)
|
| img.save(new_path, format="JPEG", quality=quality)
|
|
|
|
|
| def downscale_and_compress(
|
| img: Image.Image,
|
| save_to_path: pathlib.Path,
|
| max_width: int = 500,
|
| quality: int = 80,
|
| ):
|
| img = downscale_image(img, max_width=max_width)
|
| img.save(save_to_path, format="JPEG", quality=quality)
|
|
|