173 lines
5.9 KiB
Python
173 lines
5.9 KiB
Python
|
|
import argparse
|
|||
|
|
import logging
|
|||
|
|
from pathlib import Path
|
|||
|
|
import sys
|
|||
|
|
import os # Needed for path checks
|
|||
|
|
|
|||
|
|
# --- Path Setup ---
|
|||
|
|
# Add project root to sys.path to allow importing utils
|
|||
|
|
project_root = Path(__file__).resolve().parent.parent
|
|||
|
|
if str(project_root) not in sys.path:
|
|||
|
|
sys.path.insert(0, str(project_root))
|
|||
|
|
print(f"Added project root {project_root} to sys.path")
|
|||
|
|
|
|||
|
|
try:
|
|||
|
|
# Import the necessary function and class from your utils
|
|||
|
|
from utils.poster_notes_creator import select_additional_images
|
|||
|
|
from utils.output_handler import OutputHandler
|
|||
|
|
except ImportError as e:
|
|||
|
|
print(f"错误: 无法导入所需的模块 'utils.poster_notes_creator' 或 'utils.output_handler'.")
|
|||
|
|
print(f"错误详情: {e}")
|
|||
|
|
print(f"Python 搜索路径 (sys.path): {sys.path}")
|
|||
|
|
print("请确保你在项目根目录下运行此脚本,或者 utils 目录在 PYTHONPATH 中。")
|
|||
|
|
sys.exit(1)
|
|||
|
|
|
|||
|
|
try:
|
|||
|
|
# Check for Pillow dependency implicitly used by poster_notes_creator
|
|||
|
|
from PIL import Image
|
|||
|
|
except ImportError:
|
|||
|
|
print("错误: 未找到所需的库 PIL (Pillow)。")
|
|||
|
|
print("请先安装它: pip install Pillow")
|
|||
|
|
sys.exit(1)
|
|||
|
|
|
|||
|
|
|
|||
|
|
# --- Logging Configuration ---
|
|||
|
|
logging.basicConfig(
|
|||
|
|
level=logging.INFO,
|
|||
|
|
format='%(asctime)s - %(levelname)s - [%(filename)s:%(lineno)d] - %(message)s',
|
|||
|
|
datefmt='%Y-%m-%d %H:%M:%S'
|
|||
|
|
)
|
|||
|
|
logger = logging.getLogger(__name__)
|
|||
|
|
|
|||
|
|
# --- 主程序入口 ---
|
|||
|
|
|
|||
|
|
if __name__ == "__main__":
|
|||
|
|
# 设置命令行参数解析
|
|||
|
|
parser = argparse.ArgumentParser(
|
|||
|
|
description="调用 poster_notes_creator 选择并处理额外配图。"
|
|||
|
|
)
|
|||
|
|
parser.add_argument(
|
|||
|
|
"--run_id",
|
|||
|
|
type=str,
|
|||
|
|
required=True,
|
|||
|
|
help="当前处理流程的运行 ID。"
|
|||
|
|
)
|
|||
|
|
parser.add_argument(
|
|||
|
|
"--topic_index",
|
|||
|
|
type=int,
|
|||
|
|
required=True,
|
|||
|
|
help="当前处理的主题索引。"
|
|||
|
|
)
|
|||
|
|
parser.add_argument(
|
|||
|
|
"--variant_index",
|
|||
|
|
type=int,
|
|||
|
|
required=True,
|
|||
|
|
help="当前处理的变体索引。"
|
|||
|
|
)
|
|||
|
|
parser.add_argument(
|
|||
|
|
"--metadata_path",
|
|||
|
|
type=str,
|
|||
|
|
required=True,
|
|||
|
|
help="指向包含已用图片列表的海报元数据 JSON 文件路径 (通常是 poster_metadata.json)。"
|
|||
|
|
)
|
|||
|
|
parser.add_argument(
|
|||
|
|
"--source_image_dir",
|
|||
|
|
type=str,
|
|||
|
|
required=True,
|
|||
|
|
help="包含源图片的目录路径。"
|
|||
|
|
)
|
|||
|
|
parser.add_argument(
|
|||
|
|
"--output_dir",
|
|||
|
|
type=str,
|
|||
|
|
required=True,
|
|||
|
|
help="用于保存生成结果的根目录。"
|
|||
|
|
)
|
|||
|
|
parser.add_argument(
|
|||
|
|
"--num_additional",
|
|||
|
|
type=int,
|
|||
|
|
default=3,
|
|||
|
|
help="要选择的额外配图数量 (默认为 3)。"
|
|||
|
|
)
|
|||
|
|
parser.add_argument(
|
|||
|
|
"--variation_strength",
|
|||
|
|
type=str,
|
|||
|
|
default="medium",
|
|||
|
|
choices=["low", "medium", "high"],
|
|||
|
|
help="应用于额外配图的微调强度 (默认为 'medium')。"
|
|||
|
|
)
|
|||
|
|
parser.add_argument(
|
|||
|
|
"--extra_effects",
|
|||
|
|
action=argparse.BooleanOptionalAction, # 使用 --extra-effects 或 --no-extra-effects
|
|||
|
|
default=True,
|
|||
|
|
help="是否为额外配图添加额外视觉效果 (例如噪点、微调) (默认为启用)。"
|
|||
|
|
)
|
|||
|
|
parser.add_argument(
|
|||
|
|
"--debug",
|
|||
|
|
action='store_true',
|
|||
|
|
help="启用 DEBUG 级别日志。"
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
# 解析参数
|
|||
|
|
args = parser.parse_args()
|
|||
|
|
|
|||
|
|
# 设置日志级别
|
|||
|
|
if args.debug:
|
|||
|
|
logging.getLogger().setLevel(logging.DEBUG)
|
|||
|
|
logger.info("DEBUG 日志已启用")
|
|||
|
|
|
|||
|
|
# 输入验证
|
|||
|
|
metadata_file = Path(args.metadata_path)
|
|||
|
|
source_dir = Path(args.source_image_dir)
|
|||
|
|
output_root_dir = Path(args.output_dir)
|
|||
|
|
|
|||
|
|
if not metadata_file.is_file():
|
|||
|
|
logger.error(f"指定的元数据文件不存在或不是一个文件: {metadata_file}")
|
|||
|
|
sys.exit(1)
|
|||
|
|
if not source_dir.is_dir():
|
|||
|
|
logger.error(f"指定的源图片目录不存在或不是一个目录: {source_dir}")
|
|||
|
|
sys.exit(1)
|
|||
|
|
# output_dir 的存在性由 OutputHandler 内部处理,这里不检查
|
|||
|
|
|
|||
|
|
if args.num_additional <= 0:
|
|||
|
|
logger.error("选择的额外配图数量必须是一个正整数。")
|
|||
|
|
sys.exit(1)
|
|||
|
|
|
|||
|
|
# --- 执行操作 ---
|
|||
|
|
try:
|
|||
|
|
# 1. 初始化 OutputHandler
|
|||
|
|
# 注意:output_handler 需要 output_dir 参数
|
|||
|
|
output_handler = OutputHandler(output_dir=str(output_root_dir))
|
|||
|
|
logger.info(f"OutputHandler 初始化完成,输出根目录: {output_root_dir}")
|
|||
|
|
|
|||
|
|
# 2. 调用 poster_notes_creator 中的函数
|
|||
|
|
logger.info("开始调用 select_additional_images...")
|
|||
|
|
saved_image_paths = select_additional_images(
|
|||
|
|
run_id=args.run_id,
|
|||
|
|
topic_index=args.topic_index,
|
|||
|
|
variant_index=args.variant_index,
|
|||
|
|
poster_metadata_path=str(metadata_file),
|
|||
|
|
source_image_dir=str(source_dir),
|
|||
|
|
num_additional_images=args.num_additional,
|
|||
|
|
output_handler=output_handler, # 传递实例
|
|||
|
|
# output_filename_template 保持默认或根据需要添加参数
|
|||
|
|
variation_strength=args.variation_strength,
|
|||
|
|
extra_effects=args.extra_effects
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
# 3. 打印结果
|
|||
|
|
if saved_image_paths:
|
|||
|
|
print("\n========== 额外配图生成结果 ==========")
|
|||
|
|
for path in saved_image_paths:
|
|||
|
|
print(f" 已保存额外配图: {path}")
|
|||
|
|
print("===================================\n")
|
|||
|
|
logger.info(f"成功生成并保存了 {len(saved_image_paths)} 张额外配图。")
|
|||
|
|
else:
|
|||
|
|
print("\n未能生成或保存任何额外配图。请检查日志获取详细信息。")
|
|||
|
|
logger.warning("select_additional_images 函数没有返回任何有效的图片路径。")
|
|||
|
|
|
|||
|
|
except Exception as e:
|
|||
|
|
logger.exception("执行额外配图选择和处理时发生严重错误:")
|
|||
|
|
print(f"脚本执行过程中发生错误,请查看日志。错误信息: {e}")
|
|||
|
|
sys.exit(1)
|
|||
|
|
|
|||
|
|
logger.info("脚本执行完毕。")
|