import digitalio import busio import board from adafruit_epd.epd import Adafruit_EPD from adafruit_epd.il0373 import Adafruit_IL0373 # create the spi device and pins we will need spi = busio.SPI(board.SCK, MOSI=board.MOSI, MISO=board.MISO) ecs = digitalio.DigitalInOut(board.D10) dc = digitalio.DigitalInOut(board.D9) srcs = digitalio.DigitalInOut(board.D8) rst = digitalio.DigitalInOut(board.D7) busy = digitalio.DigitalInOut(board.D6) # give them all to our driver display = Adafruit_IL0373(152, 152, rst, dc, busy, srcs, ecs, spi) FILENAME = "blinka.bmp" # clear the buffer display.clear_buffer() def read_le(s): # as of this writting, int.from_bytes does not have LE support, DIY! result = 0 shift = 0 for byte in bytearray(s): result += byte << shift shift += 8 return result class BMPError(Exception): pass try: with open("/" + FILENAME, "rb") as f: print("File opened") if f.read(2) != b'BM': # check signature raise BMPError("Not BitMap file") bmpFileSize = read_le(f.read(4)) f.read(4) # Read & ignore creator bytes bmpImageoffset = read_le(f.read(4)) # Start of image data headerSize = read_le(f.read(4)) bmpWidth = read_le(f.read(4)) bmpHeight = read_le(f.read(4)) flip = True print("Size: %d\nImage offset: %d\nHeader size: %d" % (bmpFileSize, bmpImageoffset, headerSize)) print("Width: %d\nHeight: %d" % (bmpWidth, bmpHeight)) if read_le(f.read(2)) != 1: raise BMPError("Not singleplane") bmpDepth = read_le(f.read(2)) # bits per pixel print("Bit depth: %d" % (bmpDepth)) if bmpDepth != 24: raise BMPError("Not 24-bit") if read_le(f.read(2)) != 0: raise BMPError("Compressed file") print("Image OK! Drawing...") rowSize = (bmpWidth * 3 + 3) & ~3 # 32-bit line boundary for row in range(bmpHeight): # For each scanline... if flip: # Bitmap is stored bottom-to-top order (normal BMP) pos = bmpImageoffset + (bmpHeight - 1 - row) * rowSize else: # Bitmap is stored top-to-bottom pos = bmpImageoffset + row * rowSize # print ("seek to %d" % pos) f.seek(pos) for col in range(bmpWidth): b, g, r = bytearray(f.read(3)) # BMP files store RGB in BGR if r < 0x80 and g < 0x80 and b < 0x80: display.draw_pixel(row, col, Adafruit_EPD.BLACK) elif r >= 0x80 and g >= 0x80 and b >= 0x80: display.draw_pixel(row, col, Adafruit_EPD.WHITE) elif r >= 0x80: display.draw_pixel(row, col, Adafruit_EPD.RED) except OSError as e: if e.args[0] == 28: raise OSError("OS Error 28 0.25") else: raise OSError("OS Error 0.5") except BMPError as e: print("Failed to parse BMP: " + e.args[0]) display.display()