FashionM3 / utils.py
pangkaicheng
first commit
f8a73ec
from PIL import Image
from typing import List
def create_image_grid(image_paths: List[str], output_path: str, grid_size: int = 2) -> None:
"""
将多个图片合并为 4 宫格图片,少于 4 个则留空,确保透明背景被填充为白色,并实现等比缩放。
参数:
- image_paths: 输入图片路径列表
- output_path: 输出 4 宫格图片路径
- grid_size: 网格大小(默认 2x2)
"""
images = []
target_size = (256, 256) # 每个格子的目标尺寸
for path in image_paths[:4]:
try:
# 加载图片,保留透明性
img = Image.open(path).convert('RGBA')
# 如果图片有透明通道,将透明区域填充为白色
if img.mode == 'RGBA':
background = Image.new('RGBA', img.size, (255, 255, 255, 255)) # 白色背景
img = Image.alpha_composite(background, img)
# 转换为 RGB 模式
img = img.convert('RGB')
original_width, original_height = img.size
aspect_ratio = original_width / original_height
if original_width >= original_height:
# 宽度是长边,调整宽度到 256
new_width = 256
new_height = int(256 / aspect_ratio)
else:
# 高度是长边,调整高度到 256
new_height = 256
new_width = int(256 * aspect_ratio)
# 等比缩放
img = img.resize((new_width, new_height), Image.Resampling.LANCZOS)
# img.thumbnail(target_size, Image.Resampling.LANCZOS) # 使用高质量缩放算法
# 创建 256x256 的空白画布(白色背景)
canvas = Image.new('RGB', target_size, (255, 255, 255))
# 计算居中位置
offset_x = (target_size[0] - img.size[0]) // 2
offset_y = (target_size[1] - img.size[1]) // 2
# 将缩放后的图片居中贴到画布上
canvas.paste(img, (offset_x, offset_y))
images.append(canvas)
except Exception as e:
print(f"Error loading image {path}: {e}")
images.append(None)
# 如果图片不足 4 张,补空
while len(images) < 4:
images.append(None)
# 创建空白画布(512x512,白色背景)
grid_image = Image.new('RGB', (512, 512), (255, 255, 255)) # 白色背景
# 按 2x2 排列贴图
for idx, img in enumerate(images):
if img is not None:
x = (idx % 2) * 256
y = (idx // 2) * 256
grid_image.paste(img, (x, y))
# 保存图片为 JPG 格式
grid_image.save(output_path, quality=95) # 设置质量为 95,避免过度压缩