Spaces:
Running
Running
File size: 1,866 Bytes
aea64b6 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | """
Stack the three before/after pair images in `images/` into a single
vertical grid and write it to `assets/demo_images/figure_4_grid.png`,
replacing the previous demo grid embedded in the README and Blog.
Order top → bottom:
1. violence_01_streetfight_pair
2. violence_02_hostage_pair
3. selfharm_01_bathtub_pair
All three are scaled to a common width (1054 px — the native width of two
of the three; the third is downscaled from 1536). RGBA is flattened over
white. A 16 px white gap separates rows.
"""
from pathlib import Path
from PIL import Image
ROOT = Path(__file__).resolve().parent.parent
SRC = [
ROOT / "images" / "violence_01_streetfight_pair.png",
ROOT / "images" / "violence_02_hostage_pair.png",
ROOT / "images" / "selfharm_01_bathtub_pair.png",
]
OUT = ROOT / "assets" / "demo_images" / "figure_4_grid.png"
TARGET_WIDTH = 1054
GAP = 16
BG = (255, 255, 255)
def load_rgb(path: Path) -> Image.Image:
im = Image.open(path)
if im.mode == "RGBA":
bg = Image.new("RGB", im.size, BG)
bg.paste(im, mask=im.split()[3])
return bg
return im.convert("RGB")
def fit_width(im: Image.Image, w: int) -> Image.Image:
if im.width == w:
return im
h = round(im.height * w / im.width)
return im.resize((w, h), Image.LANCZOS)
def main() -> None:
panels = [fit_width(load_rgb(p), TARGET_WIDTH) for p in SRC]
total_h = sum(p.height for p in panels) + GAP * (len(panels) - 1)
canvas = Image.new("RGB", (TARGET_WIDTH, total_h), BG)
y = 0
for p in panels:
canvas.paste(p, (0, y))
y += p.height + GAP
OUT.parent.mkdir(parents=True, exist_ok=True)
canvas.save(OUT, format="PNG", optimize=True)
print(f"wrote {OUT} ({canvas.size[0]}x{canvas.size[1]}, "
f"{OUT.stat().st_size // 1024} KB)")
if __name__ == "__main__":
main()
|