#!python # -*- mode: python; Encoding: utf-8; coding: utf-8 -*- # Last updated: <2024/02/25 04:47:02 +0900> """ font png image to FreeBASIC header file Usage: python fontpng2bitsbas.py -i input.png --label label_name > image.bi Windows10 x64 22H2 + Python 3.10.10 64bit + Pillow 10.1.0 """ import argparse import os import sys from PIL import Image define_print = False def main(): parser = argparse.ArgumentParser() parser.add_argument("-i", "--infile", required=True, help="PNG image file") parser.add_argument("--label", help="symbol name") args = parser.parse_args() infile = args.infile if not os.path.isfile(infile): print("Error: Not found %s" % infile) sys.exit() if not args.label: label = infile.replace(".", "_") label = label.replace(" ", "_") label = label.replace("-", "_") else: label = args.label im = Image.open(infile).convert("L") im.point(lambda x: 0 if x < 128 else x) imgw, imgh = im.size w = int(imgw / 16) h = int(imgh / 6) alen = int(w / 8) + (1 if (w % 8) != 0 else 0) clen = alen * h cnum = 16 * 6 obuf = [] for c in range(16 * 6): bx = int(c % 16) * w by = int(c / 16) * h # obuf.append(" ' code = &H%02x" % (c + 0x20)) s = "" buf = [] for i in range(clen): buf.append(0) yidx = 0 for y in range(h - 1, -1, -1): for x in range(w): v = im.getpixel((bx + x, by + y)) if v > 128: buf[(alen * yidx) + int(x / 8)] |= 1 << (7 - (x % 8)) yidx += 1 for v in buf: s += ("&H%02x, " % v) s = s.rstrip(" ,") if c >= (16 * 6 - 1): obuf.append(" { %s } _" % s) else: obuf.append(" { %s }, _" % s) print("' infile: %s , source image size = %d x %d\n" % (infile, imgw, imgh)) if define_print: print("#ifndef __%s__" % label.upper()) print("#define __%s__\n" % label.upper()) print("Const %s_WIDTH = %d" % (label.upper(), w)) print("Const %s_HEIGHT = %d" % (label.upper(), h)) print("Const %s_CHR_LEN = %d\n" % (label.upper(), clen)) print( "Dim Shared %s(%d - 1, %d - 1) As UByte => { _" % (label, cnum, clen)) for s in obuf: print(s) print("}\n") if define_print: print("#endif") print("\n\n") if __name__ == "__main__": main()