From 460460335293e1ed676e35c20c348e0ef252cdfa Mon Sep 17 00:00:00 2001 From: Daniel Thompson Date: Thu, 23 Jan 2020 22:01:57 +0000 Subject: tools: rle_encode: Rework into proper functions diff --git a/tools/rle_encode.py b/tools/rle_encode.py old mode 100644 new mode 100755 index 3117ee1..aea7d40 --- a/tools/rle_encode.py +++ b/tools/rle_encode.py @@ -1,51 +1,67 @@ +#!/usr/bin/env python3 + +import sys from PIL import Image -im = Image.open('pine64.png') -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: - rl += 1 - continue - assert(rl < 255) - rle.append(rl) - rl = 1 - px = newpx -rle.append(rl) - -sx = 240 -sy = 240 -image = bytes(rle) - - -data = bytearray(2*sx) -dp = 0 -black = ord('#') -white = ord(' ') -color = black - -for rl in image: - 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 - -assert(dp == 0) +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) -- cgit v0.10.2