This commit is contained in:
Super-Yyt
2026-04-18 23:04:03 +08:00
parent 51a380e480
commit 1a4f3bff7d
12 changed files with 1023 additions and 0 deletions
+50
View File
@@ -0,0 +1,50 @@
from PIL import Image
import os
from config import Config
from logger import logger
class ImageProcessor:
@staticmethod
def resize_by_ratio(img, ratio_width, ratio_height):
"""等比例缩放至目标比例(最长边适配)"""
w, h = img.size
target_ratio = ratio_width / ratio_height
current_ratio = w / h
if current_ratio > target_ratio:
new_w = int(h * target_ratio)
new_h = h
else:
new_w = w
new_h = int(w / target_ratio)
return img.resize((new_w, new_h), Image.Resampling.LANCZOS)
@staticmethod
def resize_by_pixel(img, target_width, target_height):
"""等比例缩放至不超过目标像素(保持比例,以较长边为准)"""
w, h = img.size
ratio_w = target_width / w
ratio_h = target_height / h
ratio = min(ratio_w, ratio_h)
new_w = int(w * ratio)
new_h = int(h * ratio)
return img.resize((new_w, new_h), Image.Resampling.LANCZOS)
@staticmethod
def convert_image(input_path, output_path, target_format, quality=None):
"""转换图片格式,可选缩放(尺寸解析在外部处理)"""
try:
with Image.open(input_path) as img:
# 转换模式(RGBA转RGB对于JPEG
if target_format.lower() in ['jpg', 'jpeg'] and img.mode in ('RGBA', 'P'):
rgb_img = Image.new('RGB', img.size, (255, 255, 255))
rgb_img.paste(img, mask=img.split()[-1] if img.mode == 'RGBA' else None)
img = rgb_img
save_kwargs = {}
if target_format.lower() in ['jpg', 'jpeg', 'webp']:
save_kwargs['quality'] = quality if quality is not None else Config.DEFAULT_QUALITY
img.save(output_path, format=target_format.upper(), **save_kwargs)
logger.info(f"转换成功: {input_path} -> {output_path}")
return True
except Exception as e:
logger.error(f"转换失败 {input_path}: {e}")
return False