Mercurial > louis > kiibohd-controller
view Scan/STLcd/bitmap2Struct.py @ 398:63b1d003fd50
Stop requiring editing of example scripts
The example scripts include hardcoded values that
do not work for everyone. Instead of requiring the
files to be edited (and dirtying the git tree),
allow them to take command-line arguments.
Also adds better guidance for Mac OSX virtual
serial ports.
author | Joshua Flanagan <joshuaflanagan@gmail.com> |
---|---|
date | Tue, 10 Nov 2015 10:32:06 -0600 |
parents | 2e0074f75855 |
children | 3437e2246259 |
line wrap: on
line source
#!/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 <http://www.gnu.org/licenses/>. # Imports import sys from array import * from PIL import Image # 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() ) )