调整部分数据表配置,优化 SpriteCache 功能

This commit is contained in:
2026-09-13 20:36:21 +08:00
parent de53890de6
commit 7dc529a840
520 changed files with 24231 additions and 967 deletions
+74
View File
@@ -0,0 +1,74 @@
#!/usr/bin/env python3
import argparse
import re
from pathlib import Path
from PIL import Image
IMAGE_EXTENSIONS = {".png", ".jpg", ".jpeg", ".bmp", ".gif", ".tga", ".webp"}
def positive_int(text):
value = int(text)
if value < 1:
raise argparse.ArgumentTypeError("必须是正整数")
return value
def natural_key(path):
return [int(part) if part.isdigit() else part.lower() for part in re.split(r"(\d+)", path.name)]
def parse_args():
parser = argparse.ArgumentParser(description="把文件夹内的图片按行列拼接成一张 PNG 图集,空单元格完全透明。")
parser.add_argument("input", type=Path, help="输入图片文件夹(不递归子文件夹)")
parser.add_argument("-r", "--rows", type=positive_int, required=True, help="行数")
parser.add_argument("-c", "--cols", type=positive_int, required=True, help="列数")
parser.add_argument("-s", "--cell-size", type=positive_int, required=True, help="单元格边长(像素)")
parser.add_argument("-o", "--output", type=Path, help="输出 PNG 路径,默认为输入文件夹同级目录下的 <文件夹名>_atlas.png")
return parser.parse_args()
def collect_images(folder):
files = [path for path in folder.iterdir() if path.is_file() and path.suffix.lower() in IMAGE_EXTENSIONS]
files.sort(key=natural_key)
return files
def build_atlas(files, rows, cols, cell_size):
atlas = Image.new("RGBA", (cols * cell_size, rows * cell_size), (0, 0, 0, 0))
for index, path in enumerate(files):
row, col = divmod(index, cols)
try:
with Image.open(path) as image:
cell = image.convert("RGBA").resize((cell_size, cell_size), Image.LANCZOS)
except OSError as error:
raise SystemExit(f"错误:无法读取图片 {path}:{error}")
atlas.paste(cell, (col * cell_size, row * cell_size))
return atlas
def main():
args = parse_args()
folder = args.input
if not folder.is_dir():
raise SystemExit(f"错误:{folder} 不是有效的文件夹")
files = collect_images(folder)
if not files:
raise SystemExit(f"错误:{folder} 中没有可用的图片文件")
capacity = args.rows * args.cols
if len(files) > capacity:
raise SystemExit(f"错误:图片数量 {len(files)} 超过单元格数量 {capacity}({args.rows} 行 x {args.cols} 列)")
output = args.output if args.output else folder.parent / f"{folder.name}_atlas.png"
output.parent.mkdir(parents=True, exist_ok=True)
atlas = build_atlas(files, args.rows, args.cols, args.cell_size)
atlas.save(output, format="PNG")
print(f"已生成 {output}({atlas.width}x{atlas.height},共 {len(files)} 张图片)")
if __name__ == "__main__":
main()