mirror of
https://github.com/wowlikon/LiB.git
synced 2026-02-04 04:31:09 +00:00
транскодирование изображений
This commit is contained in:
@@ -13,6 +13,7 @@ from .captcha import (
|
||||
prng,
|
||||
)
|
||||
from .describe_er import SchemaGenerator
|
||||
from .image_processing import transcode_image
|
||||
|
||||
__all__ = [
|
||||
"limiter",
|
||||
@@ -28,4 +29,5 @@ __all__ = [
|
||||
"REDEEM_TTL",
|
||||
"prng",
|
||||
"SchemaGenerator",
|
||||
"transcode_image",
|
||||
]
|
||||
|
||||
@@ -0,0 +1,81 @@
|
||||
from pathlib import Path
|
||||
from PIL import Image
|
||||
|
||||
|
||||
TARGET_RATIO = 5 / 7
|
||||
|
||||
|
||||
def crop_image(img: Image.Image, target_ratio: float = TARGET_RATIO) -> Image.Image:
|
||||
w, h = img.size
|
||||
current_ratio = w / h
|
||||
|
||||
if current_ratio > target_ratio:
|
||||
new_w = int(h * target_ratio)
|
||||
left = (w - new_w) // 2
|
||||
right = left + new_w
|
||||
top = 0
|
||||
bottom = h
|
||||
else:
|
||||
new_h = int(w / target_ratio)
|
||||
top = (h - new_h) // 2
|
||||
bottom = top + new_h
|
||||
left = 0
|
||||
right = w
|
||||
|
||||
return img.crop((left, top, right, bottom))
|
||||
|
||||
|
||||
def transcode_image(
|
||||
src_path: str | Path,
|
||||
*,
|
||||
jpeg_quality: int = 85,
|
||||
webp_quality: int = 80,
|
||||
webp_lossless: bool = False,
|
||||
resize_to: tuple[int, int] | None = None,
|
||||
):
|
||||
src_path = Path(src_path)
|
||||
|
||||
if not src_path.exists():
|
||||
raise FileNotFoundError(src_path)
|
||||
|
||||
stem = src_path.stem
|
||||
folder = src_path.parent
|
||||
|
||||
img = Image.open(src_path).convert("RGBA")
|
||||
img = crop_image(img)
|
||||
|
||||
if resize_to:
|
||||
img = img.resize(resize_to, Image.LANCZOS)
|
||||
|
||||
png_path = folder / f"{stem}.png"
|
||||
img.save(
|
||||
png_path,
|
||||
format="PNG",
|
||||
optimize=True,
|
||||
interlace=1,
|
||||
)
|
||||
|
||||
jpg_path = folder / f"{stem}.jpg"
|
||||
img.convert("RGB").save(
|
||||
jpg_path,
|
||||
format="JPEG",
|
||||
quality=jpeg_quality,
|
||||
progressive=True,
|
||||
optimize=True,
|
||||
subsampling="4:2:0",
|
||||
)
|
||||
|
||||
webp_path = folder / f"{stem}.webp"
|
||||
img.save(
|
||||
webp_path,
|
||||
format="WEBP",
|
||||
quality=webp_quality,
|
||||
lossless=webp_lossless,
|
||||
method=6,
|
||||
)
|
||||
|
||||
return {
|
||||
"png": png_path,
|
||||
"jpeg": jpg_path,
|
||||
"webp": webp_path,
|
||||
}
|
||||
Reference in New Issue
Block a user