Pokitto-Raycasting/convert_png.py

59 lines
1.1 KiB
Python
Raw Normal View History

2018-09-03 13:43:38 +02:00
# Convert png image to 256 palette image for Pokitto.
#
# author: Miloslav Ciz
# license: CC0
import sys
from PIL import Image
2018-09-27 10:30:52 +02:00
def findClosest(pixel, palettePixels):
result = 0
closestDist = 255 * 255 * 255
for i in range(256):
p = palettePixels[i % 16,i / 16]
d = abs(p[0] - pixel[0]) + abs(p[1] - pixel[1]) + abs(p[2] - pixel[2])
if d < closestDist:
result = i
closestDist = d
if d == 0:
break
return result
2018-09-03 13:43:38 +02:00
image = Image.open(sys.argv[1])
pixels = image.load()
2018-09-27 10:30:52 +02:00
pal = Image.open(sys.argv[2])
palPixels = pal.load()
2018-09-27 15:25:20 +02:00
outImage = Image.new("RGB",(image.size[0],image.size[1]),"white")
outPixels = outImage.load()
2018-09-03 13:43:38 +02:00
sys.stdout.write("const unsigned char image[] =\n{ ")
sys.stdout.write(str(image.size[0]) + ", " + str(image.size[1]) + " // width, height")
count = 0
2018-09-05 06:33:11 +02:00
for x in range(image.size[0]):
for y in range(image.size[1]):
2018-09-03 13:43:38 +02:00
if count % 14 == 0:
sys.stdout.write("\n ");
p = pixels[x,y]
2018-09-27 15:25:20 +02:00
closest = findClosest(p,palPixels)
sys.stdout.write(",0x{:02x}".format(closest))
outPixels[x,y] = palPixels[closest % 16,closest / 16]
2018-09-03 13:43:38 +02:00
count += 1
print("\n};")
2018-09-27 15:25:20 +02:00
outImage.save("out.png")