Download split_sprites.py from build-small-hackathon/TheGrandTribunal: direct link, hf CLI and curl.
- Browser
- Download file 2.59 kB
-
https://huggingface.co/spaces/build-small-hackathon/TheGrandTribunal/resolve/main/split_sprites.py
- Command line
-
hf download hf://spaces/build-small-hackathon/TheGrandTribunal/split_sprites.py
-
curl -L -o split_sprites.py https://huggingface.co/spaces/build-small-hackathon/TheGrandTribunal/resolve/main/split_sprites.py
2.59 kB
| import os | |
| from PIL import Image | |
| SPRITE_SUFFIXES = ("talking", "listening", "thinking", "damage", "victory") | |
| SPRITE_SOURCE_MAP = { | |
| "oscar_wilde.png": "wilde", | |
| "nietzsche.png": "nietzsche", | |
| "schopenhauer.png": "schopenhauer", | |
| "socrates.png": "plato", | |
| } | |
| def trim_image(img): | |
| rgba = img.convert("RGBA") | |
| datas = rgba.getdata() | |
| width, height = rgba.size | |
| min_x, min_y = width, height | |
| max_x, max_y = -1, -1 | |
| for y in range(height): | |
| for x in range(width): | |
| r, g, b, a = datas[y * width + x] | |
| is_transparent = a == 0 | |
| is_white = r == 255 and g == 255 and b == 255 and a == 255 | |
| if not is_transparent and not is_white: | |
| if x < min_x: | |
| min_x = x | |
| if x > max_x: | |
| max_x = x | |
| if y < min_y: | |
| min_y = y | |
| if y > max_y: | |
| max_y = y | |
| if min_x > max_x or min_y > max_y: | |
| return img, (0, 0, width, height) | |
| crop_box = (min_x, min_y, max_x + 1, max_y + 1) | |
| return img.crop(crop_box), crop_box | |
| def split_sprite_sheet(image_path, num_sprites, out_dir, prefix): | |
| if not os.path.exists(image_path): | |
| print(f"Error: {image_path} not found.") | |
| return | |
| os.makedirs(out_dir, exist_ok=True) | |
| try: | |
| img = Image.open(image_path) | |
| except Exception as e: | |
| print(f"Error opening image {image_path}: {e}") | |
| return | |
| width, height = img.size | |
| segment_width = width // num_sprites | |
| print(f"\nProcessing: {image_path} (Prefix: {prefix})") | |
| print("-" * 50) | |
| for i in range(num_sprites): | |
| left = i * segment_width | |
| right = (i + 1) * segment_width | |
| segment = img.crop((left, 0, right, height)) | |
| trimmed_segment, trim_box = trim_image(segment) | |
| abs_left = left + trim_box[0] | |
| abs_upper = trim_box[1] | |
| abs_right = left + trim_box[2] | |
| abs_lower = trim_box[3] | |
| out_name = f"{prefix}_{SPRITE_SUFFIXES[i]}.png" | |
| out_path = os.path.join(out_dir, out_name) | |
| trimmed_segment.save(out_path, "PNG") | |
| print(f"[{SPRITE_SUFFIXES[i]:<10}] Segment Box: ({left}, 0, {right}, {height})") | |
| print( | |
| f" Final Crop relative to original: ({abs_left}, {abs_upper}, {abs_right}, {abs_lower})" | |
| ) | |
| print(f" Saved as {out_name}") | |
| if __name__ == "__main__": | |
| out_dir = "sprites" | |
| for img_file, prefix in SPRITE_SOURCE_MAP.items(): | |
| split_sprite_sheet(img_file, 5, out_dir, prefix) | |