# Mako: lays the renders of mk_views.py over the reference sheet's panels (plain Python + Pillow, run from the shell). # Writes previews/compare/cmp_.png: the sheet in grey, the model's outline (from the render's alpha) in red, the model's # shading at 40 % between; and cmp_all.png with every panel. import os from PIL import Image, ImageFilter, ImageOps HERE = os.path.dirname(os.path.abspath(__file__)) D = os.path.join(os.path.dirname(HERE), "previews", "compare") BP = Image.open(os.path.join(os.path.dirname(HERE), "reference", "user_reference.webp")).convert("RGB") BOX = {"top": (30, 40, 970, 520), "side": (30, 530, 970, 1065), "front": (970, 30, 1410, 530), "rear": (960, 545, 1410, 1030)} tiles = [] for name, b in BOX.items(): rp = os.path.join(D, "r_%s.png" % name) if not os.path.exists(rp): continue r = Image.open(rp).convert("RGBA") bp = BP.crop(b).resize((r.width, r.height), Image.LANCZOS) base = ImageOps.grayscale(bp).convert("RGB") shade = Image.blend(base, r.convert("RGB"), 0.40) a = r.split()[3].point(lambda v: 255 if v > 128 else 0) base = Image.composite(shade, base, a) edge = a.filter(ImageFilter.FIND_EDGES).point(lambda v: 255 if v > 60 else 0).filter(ImageFilter.MaxFilter(3)) red = Image.new("RGB", r.size, (230, 20, 20)) out = Image.composite(red, base, edge) out.save(os.path.join(D, "cmp_%s.png" % name)) tiles.append(out) if tiles: top = tiles[:2] W = sum(t.width for t in tiles[2:]) if len(tiles) > 2 else 0 sheet = Image.new("RGB", (max(tiles[0].width + (tiles[2].width if len(tiles) > 2 else 0), 1), tiles[0].height + tiles[1].height), "white") sheet.paste(tiles[0], (0, 0)); sheet.paste(tiles[1], (0, tiles[0].height)) if len(tiles) > 2: sheet.paste(tiles[2], (tiles[0].width, 0)) if len(tiles) > 3: sheet.paste(tiles[3], (tiles[0].width, tiles[0].height)) sheet.save(os.path.join(D, "cmp_all.png")) print("ok", len(tiles))