Files

40 lines
1.5 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""上传图片的尺寸闸。
火山素材审核要求图片宽高在 300–6000 px 之间,小图会被
[InvalidParameter.WidthTooSmall] 拒掉。这个限制以前只在自由创作的素材上传口做,
商品图 / 项目上传等入口没有 —— 小图能一路存进商品库,直到生成视频送审那一刻才炸,
而且报错发生在离上传很远的地方,用户根本对不上号。统一在入库前挡住。
"""
from __future__ import annotations
from io import BytesIO
MIN_EDGE = 300
MAX_EDGE = 6000
class ImageTooSmallError(ValueError):
"""尺寸不合格。文案直接面向用户。"""
def probe_image_size(raw: bytes) -> tuple[int, int]:
"""读图片宽高。读不出来抛 ImageTooSmallError(当成坏文件)。"""
from PIL import Image
try:
with Image.open(BytesIO(raw)) as im:
return int(im.width), int(im.height)
except Exception as exc: # noqa: BLE001
raise ImageTooSmallError("图片解析失败,请更换文件") from exc
def ensure_reviewable_image(raw: bytes, *, label: str = "图片") -> tuple[int, int]:
"""校验上传图片的宽高,返回 (width, height)。不合格抛 ImageTooSmallError。"""
width, height = probe_image_size(raw)
if not (MIN_EDGE <= width <= MAX_EDGE and MIN_EDGE <= height <= MAX_EDGE):
raise ImageTooSmallError(
f"{label}尺寸需在 {MIN_EDGE}{MAX_EDGE} 像素之间(当前 {width}×{height}),"
"过小的图无法通过素材审核,请换一张更大的图"
)
return width, height