2021-11-20 21:13:45 -05:00
|
|
|
import ulab.numpy as np
|
|
|
|
import displayio
|
|
|
|
import bitmaptools
|
|
|
|
|
2023-08-22 11:15:46 -04:00
|
|
|
import struct
|
2021-11-20 21:13:45 -05:00
|
|
|
|
|
|
|
base_header = b"BMFX\x02\x00\x00\x00\x00\x00F\x00\x00\x008\x00\x00\x00@\x01\x00\x00\xf0\x00\x00\x00\x01\x00\x10\x00\x03\x00\x00\x00\x00X\x02\x00\xd7\r\x00\x00\xd7\r\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf8\x00\x00\xe0\x07\x00\x00\x1f\x00\x00\x00\x00\x00\x00\x00"
|
|
|
|
|
|
|
|
|
|
|
|
def writebmp16(filename, bitmap):
|
|
|
|
header = bytearray(base_header)
|
|
|
|
header[18:26] = struct.pack("<II", bitmap.width, bitmap.height)
|
|
|
|
with open(filename, "wb") as f:
|
|
|
|
f.write(header)
|
|
|
|
b = np.frombuffer(bitmap, dtype=np.uint16)
|
|
|
|
for i in range(bitmap.height):
|
|
|
|
j = (bitmap.height - i - 1) * bitmap.width
|
|
|
|
f.write(b[j : j + bitmap.width])
|
|
|
|
|
|
|
|
|
|
|
|
def loadbmp16(filename, width=320, height=240):
|
|
|
|
"""This specialized routine loads 16bpp uncompressed bmp files with a
|
|
|
|
70-byte header. It is not appropriate for generic bmp files."""
|
|
|
|
|
|
|
|
bitmap = displayio.Bitmap(width, height, 65536)
|
|
|
|
with open(filename, "rb") as f:
|
|
|
|
f.seek(70)
|
|
|
|
bitmaptools.readinto(
|
|
|
|
bitmap,
|
|
|
|
f,
|
|
|
|
bits_per_pixel=16,
|
|
|
|
element_size=2,
|
|
|
|
reverse_rows=True,
|
|
|
|
)
|
|
|
|
|
|
|
|
return bitmap
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
if "/" in __file__:
|
|
|
|
here = __file__.rsplit("/", 1)[0]
|
|
|
|
else:
|
|
|
|
here = "."
|
|
|
|
b = loadbmp16(here + "/minerva16.bmp")
|
|
|
|
print(b[0, 0])
|
|
|
|
print(b[160, 160])
|
|
|
|
for i, p in enumerate(sorted(set(memoryview(b)))):
|
|
|
|
print("%04x" % p, end="\n" if (i % 8) == 7 else " ")
|
|
|
|
if i % 8 != 7:
|
|
|
|
print()
|