69 lines
2.3 KiB
Python
69 lines
2.3 KiB
Python
import os
|
||
import random
|
||
from pathlib import Path
|
||
from PIL import Image
|
||
|
||
# 配置参数
|
||
MAIN_BG_DIR = './微信无头像主界面截图'
|
||
AVATAR_DIR = './微信头像素材'
|
||
OUTPUT_DIR = './output'
|
||
|
||
# 区域参数
|
||
REGION_X = 8
|
||
REGION_Y = 31
|
||
REGION_W = 75
|
||
REGION_H = 75
|
||
AVATAR_SIZE = 54 # 54x54 px
|
||
|
||
# 输出目录准备
|
||
def ensure_output_dir():
|
||
os.makedirs(OUTPUT_DIR, exist_ok=True)
|
||
|
||
def get_image_files(folder):
|
||
exts = ['.jpg', '.jpeg', '.png']
|
||
return [f for f in Path(folder).iterdir() if f.suffix.lower() in exts]
|
||
|
||
def process_avatar(avatar_path):
|
||
"""缩放/裁剪为54x54,保持居中"""
|
||
img = Image.open(avatar_path).convert('RGBA')
|
||
# 等比缩放
|
||
min_side = min(img.width, img.height)
|
||
# 居中裁剪为正方形
|
||
left = (img.width - min_side) // 2
|
||
top = (img.height - min_side) // 2
|
||
img = img.crop((left, top, left + min_side, top + min_side))
|
||
img = img.resize((AVATAR_SIZE, AVATAR_SIZE), Image.LANCZOS)
|
||
return img
|
||
|
||
def random_offset():
|
||
x = random.randint(REGION_X, REGION_X + REGION_W - AVATAR_SIZE)
|
||
y = random.randint(REGION_Y, REGION_Y + REGION_H - AVATAR_SIZE)
|
||
return x, y
|
||
|
||
def main():
|
||
ensure_output_dir()
|
||
main_imgs = get_image_files(MAIN_BG_DIR)
|
||
avatar_imgs = get_image_files(AVATAR_DIR)
|
||
if not main_imgs or not avatar_imgs:
|
||
print('未找到主界面或头像素材图片')
|
||
return
|
||
avatar_count = 0
|
||
for avatar_idx, avatar_path in enumerate(avatar_imgs, 1):
|
||
avatar_img = process_avatar(avatar_path)
|
||
avatar_name = avatar_path.stem
|
||
for main_idx, main_path in enumerate(main_imgs, 1):
|
||
with Image.open(main_path).convert('RGBA') as main_img:
|
||
x, y = random_offset()
|
||
composed = main_img.copy()
|
||
composed.paste(avatar_img, (x, y), avatar_img)
|
||
# 命名规则
|
||
out_name = f"avatar_{avatar_idx:02d}_{x}-{y}_{AVATAR_SIZE}x{AVATAR_SIZE}.jpg"
|
||
out_path = os.path.join(OUTPUT_DIR, out_name)
|
||
# 转为RGB再保存为jpg
|
||
composed.convert('RGB').save(out_path, 'JPEG', quality=95)
|
||
print(f"保存: {out_path}")
|
||
avatar_count += 1
|
||
print(f"共生成{avatar_count}张合成图片。")
|
||
|
||
if __name__ == '__main__':
|
||
main() |