Licar/assets/img2array.py
2023-09-11 20:56:04 +02:00

80 lines
1.6 KiB
Python

import sys
from PIL import Image
def rgbTo565(rgb):
return ((rgb[0] >> 3) << 11) | ((rgb[1] >> 2) << 5) | ((rgb[2] >> 3))
def colorDist(c1,c2):
return abs((c1 & 0x1f) - (c2 & 0x1f)) + abs(((c1 >> 5) & 0x3f) - ((c2 >> 5) & 0x3f)) + abs((c1 >> 11) - (c2 >> 11))
FILENAME = sys.argv[1]
image = Image.open(FILENAME).convert("RGB")
IMG_SIZE = image.size[0]
pixels = image.load()
outArray = []
if IMG_SIZE == 64: # normal texture
for y in range(IMG_SIZE):
for x in range(IMG_SIZE):
outArray.append(rgbTo565(pixels[(x,y)]))
else: # sky texture
hist = [0 for i in range(65536)]
for y in range(IMG_SIZE):
for x in range(IMG_SIZE):
hist[rgbTo565(pixels[(x,y)])] += 1
for i in range(256): # make the palette from 256 most common colors
histMaxIndex = 0
for j in range(65536):
if hist[j] > hist[histMaxIndex]:
histMaxIndex = j
outArray.append(histMaxIndex)
hist[histMaxIndex] = -1
odd = True
for y in range(IMG_SIZE):
for x in range(IMG_SIZE):
pixel = rgbTo565(pixels[(x,y)])
closestIndex = 0
closestDist = 1000
for i in range(256):
dist = colorDist(pixel,outArray[i])
if dist < closestDist:
closestDist = dist
closestIndex = i
if closestDist == 0:
break
if odd:
outArray.append(closestIndex)
odd = False
else:
outArray[-1] = outArray[-1] | (closestIndex << 8)
odd = True
outStr = ""
for i in range(len(outArray)):
if i % 16 == 0:
outStr += "\n "
outStr += "{0:#0{1}x}".format(outArray[i],6)
if i != len(outArray) - 1:
outStr += ","
print(outStr)