-
Notifications
You must be signed in to change notification settings - Fork 0
/
sprite_converter.py
55 lines (47 loc) · 1.82 KB
/
sprite_converter.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
from PIL import Image
from tkinter import filedialog
SCREEN_WIDTH = 320
SCREEN_HEIGHT = 222
COLOR_CHAR = 'abcdefghijkl'
BLANK_CHAR = '.'
NEWLINE_CHAR = ','
TRANSPARENCY_LIMIT = 127
img = Image.open(filedialog.askopenfilename())
if img.width > SCREEN_WIDTH or img.height > SCREEN_HEIGHT:
img = img.resize((SCREEN_WIDTH, SCREEN_HEIGHT))
print(f'Image resize to {SCREEN_WIDTH}×{SCREEN_HEIGHT}')
img = img.convert('RGBA')
imgP = img.convert('P')
imgP = imgP.quantize(len(COLOR_CHAR))
imgP = imgP.convert('RGB')
palette = set()
for row in range(img.height):
for col in range(img.width):
if img.getpixel((col, row))[3] > TRANSPARENCY_LIMIT:
palette.add(imgP.getpixel((col, row)))
palette = list(palette)
print('(' + ','.join(["'#%02x%02x%02x'" % tuple(palette[i]) for i in range(len(palette))]) + ')')
sprite = ''
newlineFactor = 0
for row in range(img.height):
factor = 0
char = ''
blankLine = True
for col in range(img.width +1):
if char != '' and ((col == img.width and char != BLANK_CHAR) or (col < img.width and char != (BLANK_CHAR if img.getpixel((col, row))[3] <= TRANSPARENCY_LIMIT else COLOR_CHAR[palette.index(imgP.getpixel((col, row)))]))):
if blankLine and row > 0:
if newlineFactor > 1:
sprite += str(newlineFactor)
sprite += NEWLINE_CHAR
newlineFactor = 0
blankLine = False
if factor > 1:
sprite += str(factor)
sprite += char
factor = 0
if col < img.width:
char = BLANK_CHAR if img.getpixel((col, row))[3] <= TRANSPARENCY_LIMIT else COLOR_CHAR[palette.index(imgP.getpixel((col, row)))]
factor += 1
newlineFactor += 1
print(f"'{sprite}'")
input()