BurningTimesAi/공유/기획/FirstRising/아이템/icon_review_sheet.py

42 lines
2.2 KiB
Python

# -*- coding: utf-8 -*-
# 2026-10-02 PD 지시 — "피드백 해준 기준에 맞는지 검토해서 배경을 투명하게 … 리소스화". 생성한 아이콘 폴더를 채점해 검토용 시트로 묶는다.
# python icon_review_sheet.py <폴더> <round 이름(파일 머리말)> [한 시트의 줄 수=10]
# 파일 이름 규칙: <round>_<대상>_s<강도>_<순번>.png. 채점은 comfy_moba_batch.score(불투명 비율 · 가장자리 닿음 · 한 덩어리).
import glob, os, sys
from PIL import Image, ImageDraw
from comfy_moba_batch import score
def main():
folder, tag = sys.argv[1], sys.argv[2]
rows_per = int(sys.argv[3]) if len(sys.argv) > 3 else 10
groups, order = {}, []
for path in sorted(glob.glob(os.path.join(folder, tag + "_*_s*_*.png")), key=os.path.getmtime):
name = os.path.basename(path)[len(tag) + 1:].rsplit("_s", 1)[0]
if name not in groups:
groups[name] = []; order.append(name)
groups[name].append(path)
cell, pad, left = 240, 4, 90
cols = max(len(v) for v in groups.values())
for page in range(0, len(order), rows_per):
names = order[page:page + rows_per]
sheet = Image.new("RGB", (left + cols * (cell + pad) + pad, len(names) * (cell + pad) + pad), (24, 24, 28))
draw = ImageDraw.Draw(sheet)
for i, name in enumerate(names):
y = pad + i * (cell + pad)
draw.text((pad, y + 4), name, fill=(240, 220, 160))
for k, path in enumerate(sorted(groups[name])):
im = Image.open(path).convert("RGBA")
ok, opaque, edge, mainc = score(im)
# 투명 배경 확인용으로 중간 회색 바탕에 올린다
bg = Image.new("RGB", (cell, cell), (52, 52, 58)); small = im.resize((cell, cell), Image.LANCZOS); bg.paste(small, (0, 0), small)
x = left + k * (cell + pad)
sheet.paste(bg, (x, y))
draw.text((x + 3, y + 2), "#%d %s op%.2f ed%.2f mn%.2f" % (k, "OK" if ok else "X", opaque, edge, mainc), fill=(120, 255, 120) if ok else (255, 120, 120))
out = os.path.join(folder, "%s_review_%d.png" % (tag, page // rows_per))
sheet.save(out); print(out)
if __name__ == "__main__":
main()