#!/usr/bin/env python from PIL import Image, ImageOps import heatshrink2 import pathlib import shutil import struct import typing import time import re import io import os def convert_bm(img: "Image.Image | pathlib.Path") -> bytes: if not isinstance(img, Image.Image): img = Image.open(img) with io.BytesIO() as output: img = img.convert("1") img = ImageOps.invert(img) img.save(output, format="XBM") xbm = output.getvalue() f = io.StringIO(xbm.decode().strip()) data = f.read().strip().replace("\n", "").replace(" ", "").split("=")[1][:-1] data_str = data[1:-1].replace(",", " ").replace("0x", "") data_bin = bytearray.fromhex(data_str) data_encoded_str = heatshrink2.compress(data_bin, window_sz2=8, lookahead_sz2=4) data_enc = bytearray(data_encoded_str) data_enc = bytearray([len(data_enc) & 0xFF, len(data_enc) >> 8]) + data_enc if len(data_enc) + 2 < len(data_bin) + 1: return b"\x01\x00" + data_enc else: return b"\x00" + data_bin def convert_bmx(img: "Image.Image | pathlib.Path") -> bytes: if not isinstance(img, Image.Image): img = Image.open(img) data = struct.pack("