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
|
from PIL import Image
import numpy as np
import sys
def parseSprite(file_name, sprite_8x16=False, sprite_8x8=False, sprite_1bpp=False):
file = Image.open(file_name).convert("RGB")
px_array = np.asarray(file)
def getpx(sprite_nb, x, y):
double_sprite_nb = int(sprite_nb / 4)
sprite_double_line = int(double_sprite_nb / (file.width / 16))
sprite_double_column = int(double_sprite_nb % (file.width / 16))
sprite_tile_y = 1 if sprite_nb & 0b10 else 0
sprite_tile_x = 1 if sprite_nb & 0b01 else 0
if sprite_8x16 or file.width < 16:
sprite_tile_x ^= sprite_tile_y
sprite_tile_y ^= sprite_tile_x
sprite_tile_x ^= sprite_tile_y
sprite_line = sprite_double_line * 2 + sprite_tile_y
sprite_column = sprite_double_column * 2 + sprite_tile_x
if sprite_8x8:
sprite_line = int(sprite_nb / (file.width / 8))
sprite_column = int(sprite_nb % (file.width / 8))
if file.width < 16:
sprite_line = sprite_column * 2 + sprite_line
sprite_column = 0
return [int(x) for x in px_array[int(sprite_line * 8 + y)][int(sprite_column * 8 + x)]]
if file.width % 8 != 0 or file.height % 8 != 0:
raise ValueError("Width and height must be multiples of 8px")
sprite_nb = int((file.width / 8) * (file.height / 8))
result = ""
for nb in range(0, sprite_nb):
result1 = [0,0,0,0,0,0,0,0]
result2 = [0,0,0,0,0,0,0,0]
for y in range(0, 8):
for x in range(0, 8):
px = getpx(nb, x, y)
dw = px[0] - 0xe0 + px[1] - 0xf8 + px[2] - 0xd0
dlg = px[0] - 0x88 + px[1] - 0xc0 + px[2] - 0x70
ddg = px[0] - 0x34 + px[1] - 0x68 + px[2] - 0x56
db = px[0] - 0x08 + px[1] - 0x18 + px[2] - 0x20
if min(abs(db), abs(ddg)) < min(abs(dlg), abs(dw)):
result2[y] |= 1 << (7-x)
if min(abs(db), abs(dlg)) < min(abs(ddg), abs(dw)):
result1[y] |= 1 << (7-x)
if abs(db) < min(abs(dw), abs(dlg), abs(ddg)):
result += "#"
elif abs(ddg) < min(abs(dw), abs(dlg), abs(db)):
result += ";"
elif abs(dlg) < min(abs(dw), abs(ddg), abs(db)):
result += "."
else:
result += " "
result += "\n"
result += "\n\n"
for i in range(0, 8):
if sprite_1bpp:
if i == 0:
result += (".DB $%02x" % (result1[i]))
else:
result += (", $%02x" % (result1[i]))
else:
if i == 0:
result += (".DB $%02x, $%02x" % (result1[i], result2[i]))
else:
result += (", $%02x, $%02x" % (result1[i], result2[i]))
result += ("\n\n")
return result
if __name__ == "__main__":
sprite_8x16 = "--8x16" in sys.argv
sprite_8x8 = "--8x8" in sys.argv
sprite_1bpp = "--1bpp" in sys.argv
file_name = sys.argv[1]
print(parseSprite(file_name, sprite_8x16=sprite_8x16, sprite_8x8=sprite_8x8, sprite_1bpp=sprite_1bpp))
|