From 6acd0c06406fd7755097c40d1c83646ddb098295 Mon Sep 17 00:00:00 2001 From: dean Date: Tue, 17 Jul 2018 12:59:24 -0400 Subject: [PATCH] DM: add bitmap example --- examples/epd_bitmap.py | 94 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 examples/epd_bitmap.py diff --git a/examples/epd_bitmap.py b/examples/epd_bitmap.py new file mode 100644 index 0000000..adec752 --- /dev/null +++ b/examples/epd_bitmap.py @@ -0,0 +1,94 @@ +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() \ No newline at end of file