| 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) |
|
|