TravelContentCreator/examples/test_simple_collage.py

183 lines
6.2 KiB
Python
Raw Normal View History

2025-04-22 21:57:06 +08:00
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
测试图片拼贴功能
该脚本演示如何独立使用simple_collage模块创建图片拼贴
"""
import os
import sys
import argparse
import time
import random
from pathlib import Path
from PIL import Image
# 将项目根目录添加到PATH
project_root = str(Path(__file__).parent.parent.absolute())
if project_root not in sys.path:
sys.path.append(project_root)
from core import simple_collage
def parse_arguments():
"""解析命令行参数"""
parser = argparse.ArgumentParser(description='测试图片拼贴功能')
parser.add_argument('--input_dir', '-i', type=str,
help='输入图片目录路径')
parser.add_argument('--output_dir', '-o', type=str, default='collage_output',
help='输出拼贴图保存目录,默认为"collage_output"')
parser.add_argument('--width', '-w', type=int, default=900,
help='拼贴图宽度默认为900')
parser.add_argument('--height', '-h', type=int, default=1200,
help='拼贴图高度默认为1200')
parser.add_argument('--count', '-c', type=int, default=3,
help='生成拼贴图数量默认为3')
parser.add_argument('--seed', '-s', type=int, default=None,
help='随机种子,用于重现结果')
return parser.parse_args()
def get_image_files(directory):
"""获取目录中的所有图片文件"""
if not os.path.exists(directory):
raise FileNotFoundError(f"目录不存在: {directory}")
image_extensions = ['.jpg', '.jpeg', '.png', '.bmp', '.webp', '.tiff']
image_files = []
for root, _, files in os.walk(directory):
for file in files:
if any(file.lower().endswith(ext) for ext in image_extensions):
image_files.append(os.path.join(root, file))
if not image_files:
raise ValueError(f"目录中没有找到有效的图片文件: {directory}")
return image_files
def create_test_images(directory, count=5, size=(640, 480)):
"""如果没有提供输入目录,创建测试图片"""
if not os.path.exists(directory):
os.makedirs(directory)
colors = [
(255, 0, 0), # 红色
(0, 255, 0), # 绿色
(0, 0, 255), # 蓝色
(255, 255, 0), # 黄色
(255, 0, 255), # 紫色
(0, 255, 255), # 青色
(255, 165, 0), # 橙色
(128, 0, 128), # 紫色
(210, 105, 30), # 巧克力色
(0, 128, 128) # 墨绿色
]
image_files = []
for i in range(count):
# 随机选择颜色
color = colors[i % len(colors)]
# 创建纯色图片
img = Image.new('RGB', size, color)
# 保存图片
file_path = os.path.join(directory, f"test_image_{i+1}.jpg")
img.save(file_path)
image_files.append(file_path)
print(f"创建测试图片: {file_path}")
return image_files
def main():
"""主函数"""
args = parse_arguments()
# 设置随机种子
if args.seed is not None:
random.seed(args.seed)
# 确保输出目录存在
if not os.path.exists(args.output_dir):
os.makedirs(args.output_dir)
# 获取输入图片
if not args.input_dir:
print("未提供输入目录,创建测试图片...")
test_img_dir = os.path.join(args.output_dir, "test_images")
image_files = create_test_images(test_img_dir, count=7)
input_dir = test_img_dir
else:
input_dir = args.input_dir
try:
# 尝试获取图片文件列表,验证目录有效
get_image_files(input_dir)
except Exception as e:
print(f"错误: {e}")
return
# 设置目标尺寸
target_size = (args.width, args.height)
print(f"使用输入目录: {input_dir}")
print(f"拼贴图尺寸: {target_size}")
# 生成拼贴图
print(f"开始生成{args.count}张拼贴图...")
start_time = time.time()
try:
# 创建与测试不同样式的拼贴图
collage_creator = simple_collage.ImageCollageCreator()
# 1. 处理整个目录,获取多个拼贴图
print("方法1: 使用process_directory批量生成")
2025-04-26 13:45:47 +08:00
collages, used_image_names = simple_collage.process_directory(
2025-04-22 21:57:06 +08:00
input_dir,
target_size=target_size,
output_count=args.count
)
if not collages:
print("拼贴图生成失败!")
return
# 保存拼贴图
for i, collage in enumerate(collages):
output_path = os.path.join(args.output_dir, f"collage_auto_{i+1}.png")
collage.save(output_path)
2025-04-26 13:45:47 +08:00
# 输出使用的图片名称
if i < len(used_image_names):
print(f"拼贴图已保存: {output_path},使用图片: {used_image_names[i]}")
else:
print(f"拼贴图已保存: {output_path}")
2025-04-22 21:57:06 +08:00
# 2. 使用不同风格创建拼贴图
print("\n方法2: 测试不同风格")
styles = ["grid", "asymmetrical", "filmstrip", "overlap", "mosaic"]
for style in styles:
print(f"创建 {style} 风格拼贴图...")
try:
2025-04-26 13:45:47 +08:00
collage, selected_images = collage_creator.create_collage_with_style(input_dir, style, target_size)
if collage:
output_path = os.path.join(args.output_dir, f"collage_style_{style}.png")
collage.save(output_path)
print(f"风格拼贴图已保存: {output_path},使用图片: {selected_images}")
else:
print(f"创建 {style} 风格失败: 未返回有效拼贴图")
2025-04-22 21:57:06 +08:00
except Exception as e:
print(f"创建 {style} 风格失败: {e}")
elapsed = time.time() - start_time
print(f"\n拼贴图生成完成,总耗时: {elapsed:.2f}")
print(f"输出目录: {os.path.abspath(args.output_dir)}")
except Exception as e:
print(f"拼贴图生成出错: {e}")
import traceback
traceback.print_exc()
if __name__ == "__main__":
main()