File size: 2,589 Bytes
4089c3b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
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)