#!/usr/bin/env python3 # Copyright (C) 2015 by Jacob Alexander # # This file is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This file is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this file. If not, see . # Imports import sys from array import * from PIL import Image # Use pillow instead of PIL, it works with Python 3 # Convenience class to deal with converting images to a C array class STLcdGraphic: # Some constants for the LCD Driver page_width = 8 page_max_length = 132 array('B') def __init__( self, height, width ): self.height = height self.width = width # Calculate number of pages self.page_count = int( self.height / self.page_width ) self.page_length = self.width # Initialize pages to 0's self.page_data = [] for page in range( 0, self.page_count ): self.page_data.append( array( 'B', [0] * self.page_length ) ) def setpixel( self, x, y ): # Calculate which page page = int( ( self.height - y ) / self.page_width ) if page == 4: print("YAR", (x,y)) # Calculate which byte byte = x # Calculate which bit bit = int( ( self.height - y ) % self.page_width ) # Set pixel bit self.page_data[ page ][ byte ] |= (1 << bit) def getpage( self, page ): return self.page_data[ page ] def getarray( self ): struct = "{\n" for page in range( 0, self.page_count ): for elem in self.page_data[ page ]: struct += "0x{0:02x}, ".format( elem ) if page != self.page_count - 1: struct += "\n" struct += "\n}" return struct # Prints out what the image will look like on the display def preview( self ): # Top border first display = "+" for pixel in range( 0, self.width ): display += "-" display += "+\n" # Each Page for page in range( self.page_count - 1, -1, -1 ): # Each Bit (Line) for line in range( 7, -1, -1 ): # Border display += "|" # Each Byte (Column/Pixel) for byte in range( 0, self.width ): if self.page_data[ page ][ byte ] & (1 << line): display += "*" else: display += " " # Border display += "|\n" # Bottom border display += "+" for pixel in range( 0, self.width ): display += "-" display += "+\n" return display filename = sys.argv[1] if filename is None: print( "You must specify a bitmap filename. Try './bitmap2Struct.py ic_logo_lcd.bmp'" ) sys.exit( 1 ) max_height = 32 max_width = 128 x_offset = 0 y_offset = 0 output_image = STLcdGraphic( max_height, max_width ) # Load the input filename and convert to black & white try: input_image = Image.open( filename ).convert('1') except: print( "Unable to load image '{0}'".format( filename ) ) # Check the image size to see if within the bounds of the display if input_image.size[0] > max_width or input_image.size[1] > max_height: print( "ERROR: '{0}:{1}' is too large, must be no larger than {2}x{3}".format( filename, ( input_image.format, input_image.size, input_image.mode ), max_width, max_height ) ) sys.exit( 1 ) # Center the image height_start = int( ( max_height - input_image.size[1] ) / 2 ) height_end = int( height_start + input_image.size[1] ) width_start = int( ( max_width - input_image.size[0] ) / 2 ) width_end = int( width_start + input_image.size[0] ) #print( height_start ) #print( height_end ) #print( width_start ) #print( width_end ) # Iterate over all of the pixels # Also prepare the debug view of the image (disp_test) disp_test = "+" for pixel in range( 0, max_width ): disp_test += "-" disp_test += "+\n" for y in range( 0, max_height ): disp_test += "|" # Check if within height range if not ( y >= height_start and y < height_end ): disp_test += " " * max_width + "|\n|" continue for x in range( 0, max_width ): # Check if within width range if not ( x >= width_start and x < width_end ): disp_test += " " continue # Use image value to determine pixel try: if input_image.getpixel( (x - width_start, y - height_start) ) == 0: disp_test += "*" output_image.setpixel( x, y + 1 ) # +1 is due to page boundary else: disp_test += " " except IndexError: print( (x - width_start,y - height_start) ) pass disp_test += "|\n" disp_test += "+" for pixel in range( 0, max_width ): disp_test += "-" disp_test += "+\n" # BMP Conversion preview print( disp_test ) print ( output_image.preview() ) #print () print( "uint8_t array[] = {0};".format( output_image.getarray() ) )