-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathpng2h.py
executable file
·57 lines (45 loc) · 1.58 KB
/
png2h.py
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
#!/usr/bin/env python3
# convert 16x16 indexed .png file with max 16 colors to header file data for tile
from PIL import Image
import sys
DIMENSIONS = (16, 16)
MAXCOLORS = 16
if len(sys.argv) != 3:
sys.stderr.write('Syntax: %s <pngfile> <name>\n' % sys.argv[0])
sys.exit(1)
name = sys.argv[2]
try:
img = Image.open(sys.argv[1])
except:
sys.stderr.write('Error reading %s\n' % sys.argv[1])
sys.exit(1)
if img.size != DIMENSIONS:
sys.stderr.write('Warning: %s has dimensions %dx%d. Are you sure this is correct?\n'
% (sys.argv[1], img.size[0], img.size[1]))
if img.size[0] % 2 or img.size[1] % 2 or img.mode != 'P' or len(img.palette.palette) > MAXCOLORS * 3:
sys.stderr.write('%s is not in a valid format\n' % sys.argv[1])
sys.exit(1)
# engine expects row major format
img = img.transpose(Image.TRANSPOSE)
pixels = img.tobytes()
elems = img.size[0] // 2
alpha = 'transparency' in img.info
sys.stdout.write('static const unsigned char tile_%s[] PROGMEM = {' % name)
ofs = 0
for pair in [pixels[i:i+2] for i in range(0, len(pixels), 2)]:
b = pair[0] + pair[1] * 16
if not alpha:
b += 0x11
sys.stdout.write('%s0x%02x,' % ('\n\t' if ofs % elems == 0 else ' ', b))
ofs += 1
sys.stdout.write('\n};\n\n')
c = 0 if alpha else 1
pal = img.palette.tobytes()
for rgb in [pal[i:i+3] for i in range(0, len(pal), 3)]:
r = rgb[0] >> 3
g = rgb[1] >> 2
b = rgb[2] >> 3
color = (r << 11) + (g << 5) + b
if not alpha or c > 0:
sys.stdout.write('#define %s_COLOR%d\t 0x%04x\n' % (name.upper(), c, color))
c += 1