wasp-os/tools/rle_encode.py
2020-01-28 18:45:26 +00:00

68 lines
1.4 KiB
Python
Executable file

#!/usr/bin/env python3
import sys
from PIL import Image
def encode(im):
pixels = im.load()
rle = []
rl = 0
px = 0
for y in range(im.height):
for x in range(im.width):
newpx = pixels[x, y]
if newpx == px:
if rl < 255:
rl += 1
else:
# Handle overflow
rle.append(255)
rle.append(0)
rl = 1
continue
# Start a new run
rle.append(rl)
rl = 1
px = newpx
# Handle the final run
rle.append(rl)
return (im.width, im.height, bytes(rle))
def decode_to_ascii(image):
(sx, sy, rle) = image
data = bytearray(2*sx)
dp = 0
black = ord('#')
white = ord(' ')
color = black
for rl in rle:
while rl:
data[dp] = color
data[dp+1] = color
dp += 2
rl -= 1
if dp >= (2*sx):
print(data.decode('utf-8'))
dp = 0
if color == black:
color = white
else:
color = black
# Check the image is the correct length
assert(dp == 0)
image = encode(Image.open(sys.argv[1]))
# This is kinda cool for testing but let's leave this disabled until we add
# proper argument processing!
#decode_to_ascii(image)
print(f'# 1-bit RLE, generated from {sys.argv[1]}')
print(image)