# Convert png image to 256 palette image for Pokitto. # # author: Miloslav Ciz # license: CC0 import sys from PIL import Image # old code, kept just in case :) """ def rgbToIndex(r, g, b): return (r & 0b00000111) | ((g & 0b00000111) << 3) | ((b & 0b00000011) << 6) """ def encodeHSV(hue, saturation, value): result = 0 if value > 15: if saturation > 85: result = ((saturation / 86 - 1) << 7) | ((hue / 32) << 4) | ((value - 16) / 15) # "normal" color, as 0bSHHHVVVV, VVVV != 0 else: result = value / 16 # saturation near 0 => gray, as 0bVVVV0000, VVVV != 0 return result & 0b11111111 # value near 0 => black, as 0b00000000 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 image = Image.open(sys.argv[1]) #image = image.convert("HSV") pixels = image.load() pal = Image.open(sys.argv[2]) palPixels = pal.load() sys.stdout.write("const unsigned char image[] =\n{ ") sys.stdout.write(str(image.size[0]) + ", " + str(image.size[1]) + " // width, height") count = 0 for x in range(image.size[0]): for y in range(image.size[1]): if count % 14 == 0: sys.stdout.write("\n "); p = pixels[x,y] #sys.stdout.write(",0x{:02x}".format(rgbToIndex(p[0] / 32, p[1] / 32, p[2] / 85))) #sys.stdout.write(",0x{:02x}".format(encodeHSV(p[0],p[1],p[2]))) sys.stdout.write(",0x{:02x}".format(findClosest(p,palPixels))) count += 1 print("\n};")