For most practical needs, using an existing tool with metadata support is recommended. When metadata is absent, a connected‑component based blind extractor provides a good starting point.
frames = data.get('frames', data) # handle different JSON structures texture atlas extractor
output_path = Path(output_dir) output_path.mkdir(exist_ok=True) For most practical needs, using an existing tool
This naive method works for atlases with transparent gaps between sprites. from PIL import Image import numpy as np
from PIL import Image import numpy as np from scipy import ndimage def blind_extract(atlas_path, min_size=8): img = Image.open(atlas_path).convert('RGBA') alpha = np.array(img.getchannel('A')) labels, num = ndimage.label(alpha > 0) for i in range(1, num+1): ys, xs = np.where(labels == i) if len(ys) < min_size: continue x1, x2 = xs.min(), xs.max() y1, y2 = ys.min(), ys.max() sprite = img.crop((x1, y1, x2+1, y2+1)) sprite.save(f"sprite_i.png")
"frames": "player_idle_01.png": "frame": "x": 2, "y": 10, "w": 64, "h": 64, "rotated": false, "trimmed": false, "spriteSourceSize": "x": 0, "y": 0, "w": 64, "h": 64, "sourceSize": "w": 64, "h": 64
import json from PIL import Image from pathlib import Path def extract_atlas(atlas_path: str, metadata_path: str, output_dir: str): atlas = Image.open(atlas_path) with open(metadata_path, 'r') as f: data = json.load(f)