I don't think I really did. All I did was guess that the colors are
stored in some sort of 3,3,2 8 bit color format since that's what
standard CHRP does. My method for converting RGB pixels into 3,3,2 was
based on a Stack Overflow answer that I'm not so sure was accurate.
I tried something else; while I'm not quite there yet, I think I'm getting
closer. My last palette based on a Stack Overflow answer incremented the red
and green by 32, giving a range from 0x00 to 0xE0, and the blue by 64,
giving a range from 0x00 to 0xC0.
I created a new palette incrementing red and green by 36, giving a range
from 0x00 to 0xFC, and blue by 85, which gives the complete range of color
from 0x00 to 0xFF. This is much better coverage than before, and the new
palette as well as a new script that uses it is attached.
That's better, but even the 8 level palette should go from 0 to 0xff:
the best mapping for 3 bit color channels is to multiply by 255/7 and
then round to the nearest channel.
So the range should be more like 0, 36, 73, 109, 146, 182, 219, 255. The
extremes have to be mapped to the extremes.
The reason why I think the new palette is closer than the old one is that I
no longer need to invert the Debian logo's colors to make it look right. The
red is also a lot darker than it was before, going from almost pink to a
sort of burgundy. It's still not quite right, though, as more complex images
still look completely wrong.
With 3/3/2 it's impossible to produce photo realistic images. Even 16
bit, which is RGB 565 if memory serves (not used in well over a decade),
gives quite a few artefacts.
Cheers,
Gabriel
--
Ben Westover
from PIL import Image
from more_itertools import chunked
img = Image.open('image.png')
pixels = []
pixels.append(img.getpixel((j, i)))
bmp1_values = []
red = format(round(pixel[0] / 36), 'b').zfill(3)
green = format(round(pixel[0] / 36), 'b').zfill(3)
blue = format(round(pixel[0] / 85), 'b').zfill(2)
bmp1_values.append(format(int(red + green + blue, 2), 'X').zfill(2))
bmp3_values = []
bmp3_values.append("00")
bmp3_values.append("FF")
print(''.join(chunk))
print("")
print(''.join(chunk))
print("")
print(''.join(chunk))
.Untitled { color: rgb(0, 0, 0) };
.Untitled { color: rgb(0, 0, 85) };
.Untitled { color: rgb(0, 0, 170) };
.Untitled { color: rgb(0, 0, 255) };
.Untitled { color: rgb(0, 36, 0) };
.Untitled { color: rgb(0, 36, 85) };
.Untitled { color: rgb(0, 36, 170) };
.Untitled { color: rgb(0, 36, 255) };
.Untitled { color: rgb(0, 72, 0) };
.Untitled { color: rgb(0, 72, 85) };
.Untitled { color: rgb(0, 72, 170) };
.Untitled { color: rgb(0, 72, 255) };
.Untitled { color: rgb(0, 108, 0) };
.Untitled { color: rgb(0, 108, 85) };
.Untitled { color: rgb(0, 108, 170) };
.Untitled { color: rgb(0, 108, 255) };
.Untitled { color: rgb(0, 144, 0) };
.Untitled { color: rgb(0, 144, 85) };
.Untitled { color: rgb(0, 144, 170) };
.Untitled { color: rgb(0, 144, 255) };
.Untitled { color: rgb(0, 180, 0) };
.Untitled { color: rgb(0, 180, 85) };
.Untitled { color: rgb(0, 180, 170) };
.Untitled { color: rgb(0, 180, 255) };
.Untitled { color: rgb(0, 216, 0) };
.Untitled { color: rgb(0, 216, 85) };
.Untitled { color: rgb(0, 216, 170) };
.Untitled { color: rgb(0, 216, 255) };
.Untitled { color: rgb(0, 252, 0) };
.Untitled { color: rgb(0, 252, 85) };
.Untitled { color: rgb(0, 252, 170) };
.Untitled { color: rgb(0, 252, 255) };
.Untitled { color: rgb(36, 0, 0) };
.Untitled { color: rgb(36, 0, 85) };
.Untitled { color: rgb(36, 0, 170) };
.Untitled { color: rgb(36, 0, 255) };
.Untitled { color: rgb(36, 36, 0) };
.Untitled { color: rgb(36, 36, 85) };
.Untitled { color: rgb(36, 36, 170) };
.Untitled { color: rgb(36, 36, 255) };
.Untitled { color: rgb(36, 72, 0) };
.Untitled { color: rgb(36, 72, 85) };
.Untitled { color: rgb(36, 72, 170) };
.Untitled { color: rgb(36, 72, 255) };
.Untitled { color: rgb(36, 108, 0) };
.Untitled { color: rgb(36, 108, 85) };
.Untitled { color: rgb(36, 108, 170) };
.Untitled { color: rgb(36, 108, 255) };
.Untitled { color: rgb(36, 144, 0) };
.Untitled { color: rgb(36, 144, 85) };
.Untitled { color: rgb(36, 144, 170) };
.Untitled { color: rgb(36, 144, 255) };
.Untitled { color: rgb(36, 180, 0) };
.Untitled { color: rgb(36, 180, 85) };
.Untitled { color: rgb(36, 180, 170) };
.Untitled { color: rgb(36, 180, 255) };
.Untitled { color: rgb(36, 216, 0) };
.Untitled { color: rgb(36, 216, 85) };
.Untitled { color: rgb(36, 216, 170) };
.Untitled { color: rgb(36, 216, 255) };
.Untitled { color: rgb(36, 252, 0) };
.Untitled { color: rgb(36, 252, 85) };
.Untitled { color: rgb(36, 252, 170) };
.Untitled { color: rgb(36, 252, 255) };
.Untitled { color: rgb(72, 0, 0) };
.Untitled { color: rgb(72, 0, 85) };
.Untitled { color: rgb(72, 0, 170) };
.Untitled { color: rgb(72, 0, 255) };
.Untitled { color: rgb(72, 36, 0) };
.Untitled { color: rgb(72, 36, 85) };
.Untitled { color: rgb(72, 36, 170) };
.Untitled { color: rgb(72, 36, 255) };
.Untitled { color: rgb(72, 72, 0) };
.Untitled { color: rgb(72, 72, 85) };
.Untitled { color: rgb(72, 72, 170) };
.Untitled { color: rgb(72, 72, 255) };
.Untitled { color: rgb(72, 108, 0) };
.Untitled { color: rgb(72, 108, 85) };
.Untitled { color: rgb(72, 108, 170) };
.Untitled { color: rgb(72, 108, 255) };
.Untitled { color: rgb(72, 144, 0) };
.Untitled { color: rgb(72, 144, 85) };
.Untitled { color: rgb(72, 144, 170) };
.Untitled { color: rgb(72, 144, 255) };
.Untitled { color: rgb(72, 180, 0) };
.Untitled { color: rgb(72, 180, 85) };
.Untitled { color: rgb(72, 180, 170) };
.Untitled { color: rgb(72, 180, 255) };
.Untitled { color: rgb(72, 216, 0) };
.Untitled { color: rgb(72, 216, 85) };
.Untitled { color: rgb(72, 216, 170) };
.Untitled { color: rgb(72, 216, 255) };
.Untitled { color: rgb(72, 252, 0) };
.Untitled { color: rgb(72, 252, 85) };
.Untitled { color: rgb(72, 252, 170) };
.Untitled { color: rgb(72, 252, 255) };
.Untitled { color: rgb(108, 0, 0) };
.Untitled { color: rgb(108, 0, 85) };
.Untitled { color: rgb(108, 0, 170) };
.Untitled { color: rgb(108, 0, 255) };
.Untitled { color: rgb(108, 36, 0) };
.Untitled { color: rgb(108, 36, 85) };
.Untitled { color: rgb(108, 36, 170) };
.Untitled { color: rgb(108, 36, 255) };
.Untitled { color: rgb(108, 72, 0) };
.Untitled { color: rgb(108, 72, 85) };
.Untitled { color: rgb(108, 72, 170) };
.Untitled { color: rgb(108, 72, 255) };
.Untitled { color: rgb(108, 108, 0) };
.Untitled { color: rgb(108, 108, 85) };
.Untitled { color: rgb(108, 108, 170) };
.Untitled { color: rgb(108, 108, 255) };
.Untitled { color: rgb(108, 144, 0) };
.Untitled { color: rgb(108, 144, 85) };
.Untitled { color: rgb(108, 144, 170) };
.Untitled { color: rgb(108, 144, 255) };
.Untitled { color: rgb(108, 180, 0) };
.Untitled { color: rgb(108, 180, 85) };
.Untitled { color: rgb(108, 180, 170) };
.Untitled { color: rgb(108, 180, 255) };
.Untitled { color: rgb(108, 216, 0) };
.Untitled { color: rgb(108, 216, 85) };
.Untitled { color: rgb(108, 216, 170) };
.Untitled { color: rgb(108, 216, 255) };
.Untitled { color: rgb(108, 252, 0) };
.Untitled { color: rgb(108, 252, 85) };
.Untitled { color: rgb(108, 252, 170) };
.Untitled { color: rgb(108, 252, 255) };
.Untitled { color: rgb(144, 0, 0) };
.Untitled { color: rgb(144, 0, 85) };
.Untitled { color: rgb(144, 0, 170) };
.Untitled { color: rgb(144, 0, 255) };
.Untitled { color: rgb(144, 36, 0) };
.Untitled { color: rgb(144, 36, 85) };
.Untitled { color: rgb(144, 36, 170) };
.Untitled { color: rgb(144, 36, 255) };
.Untitled { color: rgb(144, 72, 0) };
.Untitled { color: rgb(144, 72, 85) };
.Untitled { color: rgb(144, 72, 170) };
.Untitled { color: rgb(144, 72, 255) };
.Untitled { color: rgb(144, 108, 0) };
.Untitled { color: rgb(144, 108, 85) };
.Untitled { color: rgb(144, 108, 170) };
.Untitled { color: rgb(144, 108, 255) };
.Untitled { color: rgb(144, 144, 0) };
.Untitled { color: rgb(144, 144, 85) };
.Untitled { color: rgb(144, 144, 170) };
.Untitled { color: rgb(144, 144, 255) };
.Untitled { color: rgb(144, 180, 0) };
.Untitled { color: rgb(144, 180, 85) };
.Untitled { color: rgb(144, 180, 170) };
.Untitled { color: rgb(144, 180, 255) };
.Untitled { color: rgb(144, 216, 0) };
.Untitled { color: rgb(144, 216, 85) };
.Untitled { color: rgb(144, 216, 170) };
.Untitled { color: rgb(144, 216, 255) };
.Untitled { color: rgb(144, 252, 0) };
.Untitled { color: rgb(144, 252, 85) };
.Untitled { color: rgb(144, 252, 170) };
.Untitled { color: rgb(144, 252, 255) };
.Untitled { color: rgb(180, 0, 0) };
.Untitled { color: rgb(180, 0, 85) };
.Untitled { color: rgb(180, 0, 170) };
.Untitled { color: rgb(180, 0, 255) };
.Untitled { color: rgb(180, 36, 0) };
.Untitled { color: rgb(180, 36, 85) };
.Untitled { color: rgb(180, 36, 170) };
.Untitled { color: rgb(180, 36, 255) };
.Untitled { color: rgb(180, 72, 0) };
.Untitled { color: rgb(180, 72, 85) };
.Untitled { color: rgb(180, 72, 170) };
.Untitled { color: rgb(180, 72, 255) };
.Untitled { color: rgb(180, 108, 0) };
.Untitled { color: rgb(180, 108, 85) };
.Untitled { color: rgb(180, 108, 170) };
.Untitled { color: rgb(180, 108, 255) };
.Untitled { color: rgb(180, 144, 0) };
.Untitled { color: rgb(180, 144, 85) };
.Untitled { color: rgb(180, 144, 170) };
.Untitled { color: rgb(180, 144, 255) };
.Untitled { color: rgb(180, 180, 0) };
.Untitled { color: rgb(180, 180, 85) };
.Untitled { color: rgb(180, 180, 170) };
.Untitled { color: rgb(180, 180, 255) };
.Untitled { color: rgb(180, 216, 0) };
.Untitled { color: rgb(180, 216, 85) };
.Untitled { color: rgb(180, 216, 170) };
.Untitled { color: rgb(180, 216, 255) };
.Untitled { color: rgb(180, 252, 0) };
.Untitled { color: rgb(180, 252, 85) };
.Untitled { color: rgb(180, 252, 170) };
.Untitled { color: rgb(180, 252, 255) };
.Untitled { color: rgb(216, 0, 0) };
.Untitled { color: rgb(216, 0, 85) };
.Untitled { color: rgb(216, 0, 170) };
.Untitled { color: rgb(216, 0, 255) };
.Untitled { color: rgb(216, 36, 0) };
.Untitled { color: rgb(216, 36, 85) };
.Untitled { color: rgb(216, 36, 170) };
.Untitled { color: rgb(216, 36, 255) };
.Untitled { color: rgb(216, 72, 0) };
.Untitled { color: rgb(216, 72, 85) };
.Untitled { color: rgb(216, 72, 170) };
.Untitled { color: rgb(216, 72, 255) };
.Untitled { color: rgb(216, 108, 0) };
.Untitled { color: rgb(216, 108, 85) };
.Untitled { color: rgb(216, 108, 170) };
.Untitled { color: rgb(216, 108, 255) };
.Untitled { color: rgb(216, 144, 0) };
.Untitled { color: rgb(216, 144, 85) };
.Untitled { color: rgb(216, 144, 170) };
.Untitled { color: rgb(216, 144, 255) };
.Untitled { color: rgb(216, 180, 0) };
.Untitled { color: rgb(216, 180, 85) };
.Untitled { color: rgb(216, 180, 170) };
.Untitled { color: rgb(216, 180, 255) };
.Untitled { color: rgb(216, 216, 0) };
.Untitled { color: rgb(216, 216, 85) };
.Untitled { color: rgb(216, 216, 170) };
.Untitled { color: rgb(216, 216, 255) };
.Untitled { color: rgb(216, 252, 0) };
.Untitled { color: rgb(216, 252, 85) };
.Untitled { color: rgb(216, 252, 170) };
.Untitled { color: rgb(216, 252, 255) };
.Untitled { color: rgb(252, 0, 0) };
.Untitled { color: rgb(252, 0, 85) };
.Untitled { color: rgb(252, 0, 170) };
.Untitled { color: rgb(252, 0, 255) };
.Untitled { color: rgb(252, 36, 0) };
.Untitled { color: rgb(252, 36, 85) };
.Untitled { color: rgb(252, 36, 170) };
.Untitled { color: rgb(252, 36, 255) };
.Untitled { color: rgb(252, 72, 0) };
.Untitled { color: rgb(252, 72, 85) };
.Untitled { color: rgb(252, 72, 170) };
.Untitled { color: rgb(252, 72, 255) };
.Untitled { color: rgb(252, 108, 0) };
.Untitled { color: rgb(252, 108, 85) };
.Untitled { color: rgb(252, 108, 170) };
.Untitled { color: rgb(252, 108, 255) };
.Untitled { color: rgb(252, 144, 0) };
.Untitled { color: rgb(252, 144, 85) };
.Untitled { color: rgb(252, 144, 170) };
.Untitled { color: rgb(252, 144, 255) };
.Untitled { color: rgb(252, 180, 0) };
.Untitled { color: rgb(252, 180, 85) };
.Untitled { color: rgb(252, 180, 170) };
.Untitled { color: rgb(252, 180, 255) };
.Untitled { color: rgb(252, 216, 0) };
.Untitled { color: rgb(252, 216, 85) };
.Untitled { color: rgb(252, 216, 170) };
.Untitled { color: rgb(252, 216, 255) };
.Untitled { color: rgb(252, 252, 0) };
.Untitled { color: rgb(252, 252, 85) };
.Untitled { color: rgb(252, 252, 170) };
.Untitled { color: rgb(252, 252, 255) };