summaryrefslogtreecommitdiff
path: root/tools/rle_encode.py
blob: aea7d40ff1b65ac88584645574716db3a64d889a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#!/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)