aboutsummaryrefslogtreecommitdiff
path: root/experiments/conv/pc2png
blob: c7f131ac68bfb42cb90f2f430d35df0a256a65b1 (plain)
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
#!/bin/python3
import math
import io
from PIL import Image

from consts import *
from shared import main

# convert a single DS tile (8x8) from packed palette index format to RGB colors
def convert_chunk(img, chunk, offset):
	palette_indices = []
	for byte in chunk:
		palette_indices += [
			(byte >> 0) & 0x0f,
			(byte >> 4) & 0x0f,
		]

	for i, palette_idx in enumerate(palette_indices):
		color = PICTOCHAT_PALETTE[palette_idx]
		location = (
			i % DS_TILE_SIZE + offset[0],
			i // DS_TILE_SIZE + offset[1],
		)
		img.putpixel(location, color)

# convert a string of tiles into a PNG image
def pc2png(data):
	tile_count = math.floor(len(data) / TILE_BYTES)
	size = (
		TILES_HORIZONTAL * DS_TILE_SIZE,
		math.ceil(tile_count / TILES_HORIZONTAL) * DS_TILE_SIZE,
	)
	img = Image.new(mode="RGB", size=size)

	for tile in range(tile_count):
		chunk_idx = tile * TILE_BYTES
		chunk = data[chunk_idx:chunk_idx+TILE_BYTES]
		tile_offset = (
			tile % TILES_HORIZONTAL,
			tile // TILES_HORIZONTAL,
		)
		convert_chunk(img, chunk, [x * DS_TILE_SIZE for x in tile_offset])

	output = io.BytesIO()
	img.save(output, format='PNG')
	return output.getvalue()

if __name__ == "__main__":
	main("bin", "png", pc2png)