从字符串中的字符生成像素矩阵

时间:2016-04-03 10:33:10

标签: python string python-3.x matrix graphics

我正在编写一个库,它将在连接到Raspberry Pi的LED矩阵上打印滚动文本。

我想要一个带有字符,高度和宽度的函数,并生成一个矩阵,其中应设置像素以表示指定的字符。

e.g。

def char_to_pixels(char, height, width):
    matrix = [width][height]

    # determine which pixels to set based on character supplied
    ...

    return matrix

因此,对于char_to_pixels('I', 6, 6)的调用,您可能会遇到如下矩阵:

|0|1|1|1|1|0|
|0|0|1|1|0|0|
|0|0|1|1|0|0|
|0|0|1|1|0|0|
|0|0|1|1|0|0|
|0|1|1|1|1|0|

我可以尝试为[A-Z]定义其中的每一个,但我想知道是否有一个库已经做过这种事情了?

2 个答案:

答案 0 :(得分:3)

使用PIL,this might be a solution。然而,一个困难是 你无法直接控制数组的宽度和高度。代替 你控制字体和fontsize。如果您的预期用途适用于特定用途 LED矩阵,那么这可能没问题 - 只需找到正确的字体和字体大小 为您的LED矩阵。

我已修改jsheperd's answer以下 所以char_to_pixels返回二进制NumPy数组。 display函数将二进制数组转换为字符数组,以便更容易看到结果。

from __future__ import print_function
import string
from PIL import Image
from PIL import ImageFont
from PIL import ImageDraw
import numpy as np

def char_to_pixels(text, path='arialbd.ttf', fontsize=14):
    """
    Based on https://stackoverflow.com/a/27753869/190597 (jsheperd)
    """
    font = ImageFont.truetype(path, fontsize) 
    w, h = font.getsize(text)  
    h *= 2
    image = Image.new('L', (w, h), 1)  
    draw = ImageDraw.Draw(image)
    draw.text((0, 0), text, font=font) 
    arr = np.asarray(image)
    arr = np.where(arr, 0, 1)
    arr = arr[(arr != 0).any(axis=1)]
    return arr

def display(arr):
    result = np.where(arr, '#', ' ')
    print('\n'.join([''.join(row) for row in result]))

for c in string.uppercase:
    arr = char_to_pixels(
        c, 
        path='/usr/share/fonts/truetype/liberation/LiberationSerif-Bold.ttf', 
        fontsize=9)
    print(arr.shape)
    display(arr)
    print()

产量

(7, 7)
  ##   
  ##   
 # ##  
 # ##  
 ####  
#   ## 
## ####

(7, 7)
#####  
 ## ## 
 ## ## 
 ####  
 ## ## 
 ## ## 
#####  

(7, 7)
  #### 
 ##  # 
 ##    
 ##    
 ##    
 ##  # 
  #### 

(7, 7)
#####  
 ## ## 
 ## ## 
 ## ## 
 ## ## 
 ## ## 
#####  

(7, 6)
##### 
 ## # 
 ##   
 ###  
 ##   
 ## # 
##### 

(7, 5)
#####
 ## #
 ##  
 ### 
 ##  
 ##  
#### 

(7, 8)
   #### 
  ##  # 
 ##     
 ##     
 ## ####
  #  ## 
   #### 

(7, 7)
### ###
 ## ## 
 ## ## 
 ##### 
 ## ## 
 ## ## 
### ###

(7, 4)
####
 ## 
 ## 
 ## 
 ## 
 ## 
####

(7, 5)
 ####
  ## 
  ## 
  ## 
  ## 
# ## 
###  

(7, 7)
#### ##
 ##    
 ## #  
 ####  
 ## ## 
 ## ## 
#### ##

(7, 6)
####  
 ##   
 ##   
 ##   
 ##   
 ## # 
##### 

(7, 8)
##  ####
##  ### 
###  ## 
# ## ## 
# ## ## 
# ## ## 
# # ####

(7, 7)
### ###
 ### # 
 ### # 
 # ### 
 # ### 
 #  ## 
###  # 

(7, 7)
  ###  
 ## ## 
 ## ## 
 ## ## 
 ## ## 
 ## ## 
  ###  

(7, 5)
#### 
 ## #
 ## #
 ### 
 ##  
 ##  
#### 

(9, 8)
  ####  
 ##  ## 
 ##  ## 
 ##  ## 
 ##  ## 
 ##  ## 
  ####  
    ##  
     ## 

(7, 7)
#####  
 ## ## 
 ## ## 
 ####  
 ## #  
 ## ## 
#### ##

(7, 5)
 ### 
## # 
###  
 ##  
  ## 
# ## 
###  

(7, 6)
######
# ## #
  ##  
  ##  
  ##  
  ##  
 #### 

(7, 7)
#######
 ##  # 
 ##  # 
 ##  # 
 ##  # 
 ##  # 
  ###  

(7, 6)
### ##
##  # 
 ## # 
 ##   
 ###  
  ##  
  ##  

(7, 9)
###    ##
 ## ## # 
 ## ## # 
 ## ##   
  ## ##  
  ## ##  
  ## ##  

(7, 6)
######
 ## # 
 ###  
  ##  
  ### 
 # ## 
######

(7, 6)
######
 ## # 
 #### 
  ##  
  ##  
  ##  
 #### 

(7, 5)
#####
# ###
  ## 
 ##  
 ##  
##  #
#####

我已经在字符上方包含了数组的形状,因此您可以查看是否 它们适合LED矩阵。

答案 1 :(得分:1)

我想如果您使用的是MAX7219,这可能会有所帮助:https://github.com/rm-hull/max7219 至少你可以得到一个意识形态