>>108426632
I wanted to show you this. I saw your maid card hex > pixel thing and made a simple python version. No compression and only image.png and card.py but it was fun.
#!/usr/bin/env python3
import sys
import os
from PIL import Image
bit_on, bit_off = (0, 0, 0, 255), (255, 255, 255, 255)
bits_from_nibble = lambda n: [bit_on if n >> k & 1 else bit_off for k in (3, 2, 1, 0)]
nibble_from_pixels = lambda pixels: sum(
((sum(px[:3]) < 384) << k) for px, k in zip(pixels, (3, 2, 1, 0))
)
def unpack():
card = Image.open("card.png").convert("RGBA")
width, height = card.size
nibbles_per_row = max(1, width // 2)
def read_nibbles(count):
chars = []
for i in range(count):
row = i // nibbles_per_row
col = i % nibbles_per_row
x, y = col * 2, row * 2
chars.append(
f"{nibble_from_pixels([card.getpixel((x, y)), card.getpixel((x + 1, y)), card.getpixel((x, y + 1)), card.getpixel((x + 1, y + 1))]):X}"
)
return "".join(chars)
size_hex = read_nibbles(8)
code_bytes = int(size_hex, 16)
total_nibbles = 8 + code_bytes * 2
hex_text = read_nibbles(total_nibbles)[8:]
open("code.py", "wb").write(bytes.fromhex(hex_text))
header_height = ((total_nibbles + nibbles_per_row - 1) // nibbles_per_row) * 2
card.crop((0, header_height, width, height)).save("image.png")
os.remove("card.png")
if __name__ == "__main__":
fail = lambda: sys.exit("Usage: maid.py pack|unpack")
cmd = sys.argv[1].lower() if len(sys.argv) > 1 else ""
if cmd == "unpack":
os.path.exists("card.png") or fail()
unpack()
else:
fail()