Download scripts/task_overview.py from yqi19/mp_yam_code: direct link, hf CLI and curl.
- Browser
- Download file 2.17 kB
-
https://huggingface.co/yqi19/mp_yam_code/resolve/main/scripts/task_overview.py
- Command line
-
hf download hf://yqi19/mp_yam_code/scripts/task_overview.py
-
curl -L -o task_overview.py https://huggingface.co/yqi19/mp_yam_code/resolve/main/scripts/task_overview.py
2.17 kB
| """Tile every task's opening frame into one high-resolution overview image. | |
| Each cell keeps its full render resolution -- the point of this sheet is to be able to zoom in on | |
| any single scene, so it is deliberately NOT downscaled to fit a screen. | |
| python scripts/task_overview.py # -> outputs/frames/overview.png | |
| python scripts/task_overview.py --cols 6 --scale 1.0 | |
| """ | |
| import argparse | |
| import glob | |
| import os | |
| from PIL import Image, ImageDraw, ImageFont | |
| ap = argparse.ArgumentParser() | |
| ap.add_argument("--frames", default="outputs/frames") | |
| ap.add_argument("--out", default="outputs/frames/overview.png") | |
| ap.add_argument("--cols", type=int, default=6) | |
| ap.add_argument("--scale", type=float, default=1.0, help="per-cell scale; 1.0 keeps full res") | |
| ap.add_argument("--pad", type=int, default=10) | |
| ap.add_argument("--label_h", type=int, default=46) | |
| a = ap.parse_args() | |
| paths = sorted(p for p in glob.glob(os.path.join(a.frames, "*.png")) | |
| if os.path.basename(p) != os.path.basename(a.out)) | |
| if not paths: | |
| raise SystemExit(f"no frames in {a.frames} -- run yam_task.py --first-frame first") | |
| first = Image.open(paths[0]) | |
| cw, ch = int(first.width*a.scale), int(first.height*a.scale) | |
| cols = min(a.cols, len(paths)) | |
| rows = (len(paths)+cols-1)//cols | |
| W = cols*cw+(cols+1)*a.pad | |
| H = rows*(ch+a.label_h)+(rows+1)*a.pad | |
| sheet = Image.new("RGB", (W, H), (17, 17, 20)) | |
| draw = ImageDraw.Draw(sheet) | |
| try: | |
| font = ImageFont.truetype("/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf", | |
| max(16, int(cw*0.045))) | |
| except OSError: | |
| font = ImageFont.load_default() | |
| for i, p in enumerate(paths): | |
| r, c = divmod(i, cols) | |
| x = a.pad+c*(cw+a.pad) | |
| y = a.pad+r*(ch+a.label_h+a.pad) | |
| im = Image.open(p).convert("RGB") | |
| if (im.width, im.height) != (cw, ch): | |
| im = im.resize((cw, ch), Image.LANCZOS) | |
| sheet.paste(im, (x, y)) | |
| name = os.path.splitext(os.path.basename(p))[0] | |
| draw.text((x+6, y+ch+8), f"{i+1:2d}. {name}", fill=(245, 226, 120), font=font) | |
| sheet.save(a.out) | |
| print(f"[overview] {a.out} {sheet.width} x {sheet.height} px, " | |
| f"{len(paths)} tasks in {cols} x {rows}") | |