# compose.py out.png raw:rows:rowcounts:index[:m[:scale]] ... - cut chosen figures out of raw sheets and # set them in one row on flat magenta (feet on one line, wide gaps), for pixelize_sprite.py --views N import sys sys.path.insert(0, "/home/zink/Projects/dungeoncraft/tools") import pixelize_sprite as ps from PIL import Image, ImageOps out = sys.argv[1]; figs = [] for spec in sys.argv[2:]: parts = spec.split(":") raw, rows, rc, idx = parts[0], int(parts[1]), [int(v) for v in parts[2].split(",")], int(parts[3]) img = Image.open(raw).convert("RGB") mask, boxes = ps.figure_boxes(img, rows, max(rc), "auto", "auto", rc) x0, y0, x1, y1 = boxes[idx] rgba = img.crop((x0, y0, x1, y1)).convert("RGBA") # background pixels transparent so they become pure magenta on the new sheet a = Image.new("L", rgba.size, 0) a.putdata([255 if mask[y][x] else 0 for y in range(y0, y1) for x in range(x0, x1)]) rgba.putalpha(a) if len(parts) > 4 and parts[4] == "m": rgba = ImageOps.mirror(rgba) if len(parts) > 5: k = float(parts[5]) rgba = rgba.resize((round(rgba.width * k), round(rgba.height * k)), Image.NEAREST) figs.append(rgba) gap = 120 W = sum(f.width for f in figs) + gap * (len(figs) + 1); H = max(f.height for f in figs) + 2 * gap sheet = Image.new("RGBA", (W, H), (255, 0, 255, 255)); x = gap for f in figs: sheet.alpha_composite(f, (x, H - gap - f.height)); x += f.width + gap sheet.convert("RGB").save(out); print(out, sheet.size)