convert png to bin file

Viewed 67

i am trying to convert png files to bin files to be used in a bootloader and its not working what am i doing wrong and btw its probably python2 and it uses PIL not pillow can someone help fix this code please it would be appreciated

import math
import struct
import os
#from io import BytesIO
from PIL import Image

doscolors = [
    (0x00, 0x00, 0x00), # 0
    (0x00, 0x00, 0xa8), # 1
    (0x00, 0xa8, 0x00), # 2
    (0x00, 0xa8, 0xa8), # 3
    (0xa8, 0x00, 0x00), # 4
    (0xa8, 0x00, 0xa8), # 5
    (0xa8, 0xa8, 0x00), # 6
    (0xa8, 0xa8, 0xa8), # 7
    
    (0x54, 0x54, 0x54), # 8
    (0x54, 0x54, 0xff), # 9
    (0x54, 0xff, 0x54), # 10
    (0x54, 0xff, 0xff), # 11
    (0xff, 0x54, 0x54), # 12
    (0xff, 0x54, 0xff), # 13
    (0xff, 0xff, 0x54), # 14
    (0xff, 0xff, 0xff), # 15
]

def color_distance(a, b):
    return math.sqrt( (a[0]-b[0])**2 + (a[1]-b[1])**2 + (a[2]-b[2])**2 )
    
def nearest_color(color):
    nearest = 0
    
    for i in range(len(doscolors)):
        if color_distance(color, doscolors[i]) < color_distance(color, doscolors[nearest]):
            nearest = i
    
    return nearest

buf = ""

for imgf in sys.argv[1:-1]:
    img = Image.open(imgf).convert("RGB")
    w, h = img.size
    
    for y in xrange(0, h, 2):
        for x in xrange(w):
            b = (nearest_color(img.getpixel((x, y))) << 4) | nearest_color(img.getpixel((x, y+1)))
            buf += chr(b)
            
    img.close()

with open(sys.argv[::-1][0], "wb") as out:
    out.write(buf)
1 Answers

To figure out which python version you’re using, try using a terminal or cmd and type:

python -V

   

Not sure how to help exactly, as i don’t know what errors you’re getting but this modified version of your script seems to run:


import math
import struct
import os
import sys
#from io import BytesIO
from PIL import Image

doscolors = [
    (0x00, 0x00, 0x00), # 0
    (0x00, 0x00, 0xa8), # 1
    (0x00, 0xa8, 0x00), # 2
    (0x00, 0xa8, 0xa8), # 3
    (0xa8, 0x00, 0x00), # 4
    (0xa8, 0x00, 0xa8), # 5
    (0xa8, 0xa8, 0x00), # 6
    (0xa8, 0xa8, 0xa8), # 7
    
    (0x54, 0x54, 0x54), # 8
    (0x54, 0x54, 0xff), # 9
    (0x54, 0xff, 0x54), # 10
    (0x54, 0xff, 0xff), # 11
    (0xff, 0x54, 0x54), # 12
    (0xff, 0x54, 0xff), # 13
    (0xff, 0xff, 0x54), # 14
    (0xff, 0xff, 0xff), # 15
]

def color_distance(a, b):
    return math.sqrt( (a[0]-b[0])**2 + (a[1]-b[1])**2 + (a[2]-b[2])**2 )
    
def nearest_color(color):
    nearest = 0
    
    for i in range(len(doscolors)):
        if color_distance(color, doscolors[i]) < color_distance(color, doscolors[nearest]):
            nearest = i
    
    return nearest

buf = ""

for imgf in sys.argv[1:-1]:
    img = Image.open(imgf).convert("RGB")
    w, h = img.size
    
    for y in xrange(0, h, 2):
        for x in xrange(w):
            b = (nearest_color(img.getpixel((x, y))) << 4) | nearest_color(img.getpixel((x, y+1)))
            buf += chr(b)
            
    img.close()

with open(sys.argv[::-1][0], "wb") as out:
    out.write(str.encode(buf))

Your script gave me errors with the str encoding and with sys so that’s what I fixed.

I also found this other answer that could be helpful for you.

Related