45 lines
1.4 KiB
Python
45 lines
1.4 KiB
Python
"""
|
|
Run-once script to split dukes.jpg and dukes_expansion.jpg into individual card images.
|
|
Card cell size is derived from image dimensions / grid, starting from the top-left corner.
|
|
"""
|
|
|
|
from pathlib import Path
|
|
from PIL import Image
|
|
|
|
TRIM = 2
|
|
|
|
SOURCES = [
|
|
("images/dukes.jpg", "images/dukes", 10, 3),
|
|
("images/dukes_expansion.jpg", "images/dukes", 4, 2),
|
|
]
|
|
|
|
for source_path, out_dir_path, cols, rows in SOURCES:
|
|
source = Path(source_path)
|
|
out_dir = Path(out_dir_path)
|
|
out_dir.mkdir(parents=True, exist_ok=True)
|
|
|
|
img = Image.open(source)
|
|
W, H = img.size
|
|
cell_w = W / cols
|
|
cell_h = H / rows
|
|
print(f"{source.name}: {W}x{H}px → cell {cell_w:.1f}x{cell_h:.1f}px ({cols}x{rows} grid)")
|
|
|
|
for row in range(rows):
|
|
for col in range(cols):
|
|
left = round(col * cell_w)
|
|
top = round(row * cell_h)
|
|
right = round((col + 1) * cell_w)
|
|
bottom = round((row + 1) * cell_h)
|
|
|
|
card = img.crop((left, top, right, bottom))
|
|
card = card.crop((TRIM, TRIM, card.width - TRIM, card.height - TRIM))
|
|
|
|
name = f"duke_r{row+1:02d}c{col+1:02d}.jpg"
|
|
out_path = out_dir / name
|
|
if out_path.exists():
|
|
stem, suffix = name.rsplit(".", 1)
|
|
name = f"{stem}_exp.{suffix}"
|
|
card.save(out_dir / name, quality=90)
|
|
|
|
print(f" → saved to {out_dir}/")
|