Python中的“点阵字体”

“点阵字体”是个啥?,在python中怎么使?在现在全面高清的 5 G 5G 5G时代,它还有用“武”之地?


(笔记模板由python脚本于2024年06月01日 18:44:31创建,本篇笔记适合会基本编程的coder翻阅)


【学习的细节是欢悦的历程】


  自学并不是什么神秘的东西,一个人一辈子自学的时间总是比在学校学习的时间长,没有老师的时候总是比有老师的时候多。
            —— 华罗庚




“点阵字体”是个啥?
点 阵 字 体
(在python中怎么使?)


本文质量分:

96 96 96

本文地址: https://blog.csdn.net/m0_57158496/article/details/139508604

CSDN质量分查询入口:http://www.csdn.net/qc


目 录

  • ◆ Python中的“点阵字体”
    • 1、点阵字体?
    • 2、适用python的点阵字库
    • 3、点阵字库应用场景
    • 4、点阵字库的使用
    • 5、在Python中应用点阵字库
      • 5.1 怎样通过python应用点阵字库?
      • 5.2 luma.led_matrix库简介
    • 6、在python中模拟“点阵”打印
      • 6.1 模拟打印当前时间
      • 6.2 代码解析
    • 7、完整源码(Python)


◆ Python中的“点阵字体”


1、点阵字体?


   点 阵 字 体 是 个 啥 ? 点阵字体是个啥? 点阵字体,说白了就是在一个设定块状区域内,用点的序列““出””的样子。一般是在白色背景上用黑色的点“画”。

  看到“点阵字体”这个概念,想方儿对它进行了一些了解。您如有兴趣,跟着我一起扒拉扒拉,看看我都晓得了些啥?


您请先瞅瞅我在python中模拟的时间打印——

  • 代码运行效果截屏图片
    在这里插入图片描述
      这是用5×5*字符定义了一个只有0123456789: 11 11 11个字符的简单“点阵字库”来玩儿一下的产物。



回页目录


2、适用python的点阵字库


  在Python中生成点阵字库,通常可以使用专门的库来将字符转换成点阵格式。以下是一些可以用于生成点阵字库的Python库:

  1. python-font-to-dotmatrix - 这是一个可以将字体转换为点阵格式的库,可以用于将字符转换为可以在点阵显示器上显示的格式。
  2. dotmap - 这是一个可以将字符转换为点阵地图的库,可以用于生成字符的点阵表示。
  3. CharMapper - 这是一个可以用于创建字符映射的库,可以将字符映射到点阵显示上。
  4. Pillow(PIL Fork)- 虽然Pillow主要是图像处理库,但它可以用来处理图像上的文字,包括生成文字的点阵表示。
  5. python-bdf - 这个库可以解析BDF(Bitmap Distribution Format)字体文件,这种文件格式包含了字体的点阵信息。
  6. fontTools - 这个库提供了广泛的字体处理功能,包括操作TrueType、OpenType等字体格式,也可以用来提取字体的点阵信息。
  在使用这些库时,通常需要结合具体的硬件规格,如点阵显示器的分辨率和像素排列方式,来生成适用于特定设备的点阵字库。这些库可能需要结合其他图形处理库或硬件控制库来在点阵显示器上显示文字。

  在开发过程中,请确保遵守相关的开源协议和知识产权法律法规,尊重字体的版权和使用权限。如果需要商业用途或定制化的点阵字库,可能需要联系专业的字体设计公司或个人来获取授权和定制服务。



回页目录


3、点阵字库应用场景


  点阵字库具有广泛的实际应用场景,尤其是在嵌入式系统和硬件限制较大的场合。以下是一些常见的应用场景:

  1. 嵌入式显示:许多嵌入式设备,如单片机、微控制器驱动的设备、POS机、小型打印机、手持设备等,使用点阵字库来显示文本信息,因为它们通常不需要高分辨率的显示。
  2. 工业控制面板:在工业环境中,点阵字库常用于控制面板和显示屏,以显示状态信息、警报、实时数据等。
  3. 车载显示屏:汽车中的信息显示屏,如车载导航系统、电子仪表盘等,可能会使用点阵字库来显示信息。
  4. 电子看板和广告牌:在公共场所,如公交车站、地铁站、机场等地方,点阵字库可以用于显示时间、航班信息、广告等。
  5. 打印机:点阵打印机使用点阵字库来打印文本,尽管现在激光和喷墨打印机更为常见,但在一些特定的应用中,点阵打印机仍然在使用。
  6. 复古游戏和电子玩具:复古风格的电子游戏机和电子玩具可能会使用点阵字库来显示文本和图形。
  7. DIY项目:业余爱好者和DIY者可能会使用点阵字库在他们的项目中显示文本,如自制时钟、小型游戏机等。
  8. 通讯设备:一些老式的通讯设备,如传真机、电报机等,使用点阵字库来显示和打印文本信息。
  9. 专业仪器:在医疗、科研等专业领域,一些仪器可能会使用点阵字库来显示测量结果或状态信息。
  10. 艺术和设计:艺术家和设计师有时也会使用点阵字库来创造复古或独特的视觉效果。
  点阵字库的优势在于它们的简单性和低资源需求,这使得它们非常适合在资源受限的环境中工作。随着技术的发展,虽然高分辨率的显示技术越来越普及,但点阵字库仍然在许多应用中占有一席之地。



回页目录


4、点阵字库的使用


  点阵字库,在不同的编程语言环境中使用方法一样吗?点阵字库的使用方法,在不同的编程语言环境中会有所不同,因为每种语言都有其独特的语法和库。不过,基本的思路是相似的,通常包括以下几个步骤:

  1. 选择或创建字库:首先,你需要有一个点阵字库,这可以是一个预先生成的字库文件,或者你可以使用特定的工具或库来创建一个。
  2. 加载字库:在程序中加载点阵字库,这通常涉及到读取字库文件或将字库数据集成到程序中。
  3. 映射字符:将需要显示的字符映射到点阵字库中的对应点阵数据。每个字符通常都有一个唯一的编码或索引。
  4. 显示或输出:将点阵数据输出到显示设备上,如点阵显示器、打印机或其他类型的输出设备。
  5. 字体渲染:在某些情况下,可能需要进行字体渲染,将点阵数据转换为可以显示的图形格式。
    在不同的编程语言中,这些步骤可能会以不同的方式实现。以下是一些示例:

下面是常用语言的三个简单示例代码


P y t h o n Python Python

# 假设使用一个预定义的点阵字库
from dotmatrix import DotMatrixFont
# 加载字库
font = DotMatrixFont('path/to/font')
# 获取字符点阵数据
character_bitmap = font.get_char_bitmap('A')
# 输出点阵数据到显示器
display.show_bitmap(character_bitmap)

C / C + + C/C++ C/C++

// 假设有一个点阵字库数组
const uint8_t font_data[] = {/* 点阵字库数据 */};
// 获取字符点阵数据
uint8_t char_bitmap[8]; // 假设每个字符是8x8的点阵
memcpy(char_bitmap, font_data + ('A' * 8), 8);
// 在显示设备上显示字符
display_draw_bitmap(char_bitmap, x, y);

J a v a S c r i p t JavaScript JavaScript(用于Web)

// 假设有一个点阵字库对象
const font = {/* 点阵字库对象 */};
// 获取字符点阵数据
const characterBitmap = font['A'];
// 在Canvas上绘制字符
const ctx = document.getElementById('canvas').getContext('2d');
ctx.drawImage(characterBitmap, x, y);

  在实际应用中,你需要根据所使用的编程语言和具体的库或框架来调整代码。不同的库可能会提供不同的函数和对象来操作点阵字库。因此,了解你所使用的语言和库的文档是至关重要的。



回页目录


5、在Python中应用点阵字库


5.1 怎样通过python应用点阵字库?

  在Python中应用点阵字库,通常是指使用特定的库来渲染点阵字体,这种字体由像素点组成,常用于嵌入式设备或需要小尺寸字体的场合。以下是一个基本的步骤指南,展示如何在Python中应用点阵字库:

  1. 选择或获取点阵字库
    点阵字库通常是一些*.h文件,包含了字符的像素数据。你可以从网上找到一些开源的点阵字库,或者使用工具生成你自己的点阵字库。
  2. 选择合适的Python库
    有一些Python库支持点阵字库的使用,例如luma.led_matrixPillow等。这些库可以帮助你将点阵字库中的数据转换成可以在屏幕上显示的图像。
  3. 安装必要的库
    使用pip安装你选择的库。例如,如果你选择了luma.led_matrix,你可以使用以下命令安装:
    pip install luma.led_matrix
    
  4. 编写代码加载点阵字库
    在Python代码中,你可以定义函数来加载点阵字库文件,并将字库中的数据转换成Python可以理解的结构。
  5. 渲染字体
    使用选定的库,根据点阵字库中的数据渲染字体到屏幕或图像上。
  6. 显示或保存结果
    渲染完成后,你可以将结果显示在屏幕上,或者保存为图片文件。


下面是一个使用Pillow库的简单例子,展示如何加载点阵字库并显示一个字符:

from PIL import Image, ImageDraw
# 假设你有一个点阵字库,每个字符是一个8x8像素的矩阵
# 定义一个字符的点阵数据
dot_matrix_char = [
    [0, 1, 1, 0, 1, 1, 0, 0],
    [1, 0, 0, 1, 0, 0, 1, 0],
    [1, 0, 0, 1, 0, 0, 1, 0],
    [1, 0, 0, 1, 0, 0, 1, 0],
    [1, 0, 0, 1, 0, 0, 1, 0],
    [1, 0, 0, 1, 0, 0, 1, 0],
    [1, 0, 0, 1, 0, 0, 1, 0],
    [0, 1, 1, 0, 1, 1, 0, 0]
]
# 创建一个8x8的黑色图像
img = Image.new('1', (8, 8), 0)
# 使用ImageDraw来绘制点阵字符
d = ImageDraw.Draw(img)
for y, row in enumerate(dot_matrix_char):
    for x, value in enumerate(row):
        if value == 1:
            d.point((x, y), fill=1)
# 显示图像
img.show()

  这个例子只是展示了如何在Python中处理点阵数据的基本方法。实际应用中,你可能需要读取*.h文件中的数据,或者处理更复杂的字体和格式。



回页目录


5.2 luma.led_matrix库简介


  Pillowluma.led_matrix都是比较好用的Python库,Pillow功能强大好用且大家都比较熟悉,在这里就简单介绍一下后者。luma.led_matrix是一个轻量级且易用的Python 库,它提供了一个API来控制各种LED矩阵和类似显示设备。这个库是luma.lcd项目的一部分,后者是一组用于控制LCD显示屏的Python库。


luma.led_matrix 支持多种硬件,包括但不限于:

  • MAX7219或MAX7221控制的LED矩阵
  • APA102 / DotStar RGB LED矩阵
  • WS2812 / NeoPixel RGB LED矩阵
  • PWM控制的单色LED矩阵


这个库的主要特点包括:

  • 支持多种硬件设备
  • 提供简单的API来绘制文本、形状和图像
  • 支持多种字体,包括点阵字体
  • 可以与luma.core库结合使用,后者提供了更高级的图形功能,如旋转、缩放和颜色处理


  luma.led_matrix 库通常用于创建信息显示屏、广告牌、状态指示器等。它通过SPI或类似接口与LED矩阵板通信,允许用户在Python中轻松控制LED矩阵的显示内容。


安装luma.led_matrix库通常很简单,可以使用pip:

pip install luma.led_matrix


  使用luma.led_matrix时,你需要根据你的硬件设备选择合适的显示驱动,并初始化一个显示实例。然后,你可以使用提供的绘图功能来显示文本、图像和其他图形元素。
以下是一个简单的例子,展示了如何使用luma.led_matrix库来显示文本:

from luma.led_matrix.device import max7219
from luma.core.interface.serial import spi, noop
from luma.core.render import canvas
from luma.core.legacy import text
# 初始化SPI接口
serial = spi(port=0, device=0, gpio=noop())
# 创建一个MAX7219控制的LED矩阵设备实例
device = max7219(serial, width=32, height=8)
# 使用canvas来绘制内容
with canvas(device) as draw:
    text(draw, (0, 0), "Hello World", fill="white")
# 保持程序运行,以便LED矩阵可以继续显示内容
try:
    while True:
        pass
except KeyboardInterrupt:
    pass

  这个例子假设你有一个连接到SPI接口的MAX7219控制的LED矩阵。它会显示文本 “Hello World”。注意,实际使用时你可能需要根据你的硬件配置调整SPI端口和设备参数。



回页目录


6、在python中模拟“点阵”打印


6.1 模拟打印当前时间


  • 代码运行效果截屏图片
    在这里插入图片描述

  • 点阵字库0123456789:,仅数字0-9和冒号:11个ASCII字符的简易点阵字库,每个字符是5×5的点阵

chars = [
    [
        "     ",
        "  *  ",
        "     ",
        "  *  ",
        "     ",
    ],
    [
        "*****",
        "*   *",
        "*   *",
        "*   *",
        "*****"
    ],
    [
        "  *  ",
        " **  ",
        "  *  ",
        "  *  ",
        " *** "
    ],
    [
        "*****",
        "    *",
        "*****",
        "*    ",
        "*****"
    ],
    [
        "*****",
        "    *",
        " ****",
        "    *",
        "*****"
    ],
    [
        "*  * ",
        "*  * ",
        "*****",
        "   * ",
        "   * "
    ],
    [
        "*****",
        "*    ",
        "*****",
        "    *",
        "*****"
    ],
    [
        "*****",
        "*    ",
        "*****",
        "*   *",
        "*****"
    ],
    [
        " ****",
        "    *",
        "    *",
        "    *",
        "    *"
    ],
    [
        "*****",
        "*   *",
        "*****",
        "*   *",
        "*****"
    ],
    [
        "*****",
        "*   *",
        "*****",
        "    *",
        "*****"
    ]
] # 11个字符图形列表

charDict = dict(zip(':0123456789', chars)) # 利用dict和zip函数,生成字符映射字典——简易“点阵字库”

  自己“”了一个简易点阵字符列表,利用dict和zip函数,将列表生成字符映射字典——简易“点阵字库”。


Python代码


t = localtime()[3:5] # 截取当前系统时、分数据
nowstr = f"{t[0]:0>2}:{t[1]:0>2}" # 字符串格式化当前时间
#input(nowstr) 
nowArray = [charDict.get(i) for i in nowstr]
#input(nowArray)

print() 

for i in range(5):
    print(f"{'':>5}{' '.join([nowArray[j][i] for j in range(5)])}")

print()

#lines = '\n'.join([f"{'':>5}{' '.join([nowArray[j][i] for j in range(5)])}" for i in range(5)]) # 列表解析每行字符数据并用“\n”拼接
#print(f"\n{lines}\n")

  • 被注释掉的两行代码,也可以同样地完成for循环的功能,它的样子更 P y t h o n Python Python
    在这里插入图片描述



回页目录


6.2 代码解析


  我这段儿代码,就是把当前系统时间,格式化成“HH:mm”的形式,把其字符“置换”成5×5点阵字体,打印到Python“终端”(控制台)。

  难点在于,点阵字符串的打印,python终端是逐午打印的,而点阵字体却分布于5行。我采用的是拼接 5 个 5个 5时间字符”的每行*来实现打印的。


  • 下面是代码的逐行解析:
  1. #!/usr/bin/env python:这是一个shebang行,用于指定此脚本应该由哪个解释器执行。在这里,它指定使用环境变量python指定的Python解释器。
  2. # coding: utf-8:这是一个编码声明,用于指定源代码文件使用的字符编码是UTF-8
  3. from time import localtime:导入time模块中的localtime函数,该函数用于获取当前系统的本地时间数据数组。
  4. chars:这是一个列表,包含了数字0-9和冒号:字符的5x5点阵表示。每个子列表代表一个字符的点阵图形。
  5. charDict = dict(zip(':0123456789', chars)):创建一个字典,将字符(数字0-9和冒号:)映射到它们的点阵表示。
  6. t = localtime()[3:5]:调用localtime函数获取当前时间,然后从中提取小时和分钟(索引3和4)。
  7. nowstr = f"{t[0]:0>2}:{t[1]:0>2}":将提取的小时和分钟格式化为一个字符串,例如“09:45”。这里使用了格式化字符串语法,确保小时和分钟都是两位数,不足部分用0填充。
  8. nowArray = [charDict.get(i) for i in nowstr]:遍历nowstr中的每个字符,从charDict中获取对应的点阵表示,并将它们存储在一个列表中。
  9. 代码接下来使用两个循环来打印时间。外层循环遍历点阵的每一行(共5行),内层循环遍历当前时间的每个字符。它使用join方法和列表解析来构造并打印每一行的点阵字符。
  10. 注释掉的lines变量和print语句是另一种打印方式,它首先构造一个包含所有行的字符串,然后一次性打印出来。这种方式更为Python,且比for更为简洁高效,但对初入坑Python的code person不太“友好”。

  总的来说,这段儿代码将当前时间以点阵的形式显示在控制台上,每个数字和冒号都是由星号(*)组成的5x5的点阵图形。


单行Python打印代码


lines = '\n'.join([f"{'':>5}{' '.join([nowArray[j][i] for j in range(5)])}" for i in range(5)]) # 列表解析每行字符数据并用“\n”拼接
print(f"\n{lines}\n")



回页目录


7、完整源码(Python)

(源码较长,点此跳过源码)

#!/sur/bin/nve python
## coding: utf-8 
from time import localtime 



chars = [
    [
        "     ",
        "  *  ",
        "     ",
        "  *  ",
        "     ",
    ],
    [
        "*****",
        "*   *",
        "*   *",
        "*   *",
        "*****"
    ],
    [
        "  *  ",
        " **  ",
        "  *  ",
        "  *  ",
        " *** "
    ],
    [
        "*****",
        "    *",
        "*****",
        "*    ",
        "*****"
    ],
    [
        "*****",
        "    *",
        " ****",
        "    *",
        "*****"
    ],
    [
        "*  * ",
        "*  * ",
        "*****",
        "   * ",
        "   * "
    ],
    [
        "*****",
        "*    ",
        "*****",
        "    *",
        "*****"
    ],
    [
        "*****",
        "*    ",
        "*****",
        "*   *",
        "*****"
    ],
    [
        " ****",
        "    *",
        "    *",
        "    *",
        "    *"
    ],
    [
        "*****",
        "*   *",
        "*****",
        "*   *",
        "*****"
    ],
    [
        "*****",
        "*   *",
        "*****",
        "    *",
        "*****"
    ]
] # 5×5的点阵字符列表

charDict = dict(zip(':0123456789', chars)) # 生成字符映射字典

t = localtime()[3:5] # 截取当前系统时、分数据
nowstr = f"{t[0]:0>2}:{t[1]:0>2}" # 字符串格式化当前时间
#input(nowstr) 
nowArray = [charDict.get(i) for i in nowstr]
#input(nowArray)

print() 

for i in range(5):
    print(f"{'':>5}{' '.join([nowArray[j][i] for j in range(5)])}")

print()

#lines = '\n'.join([f"{'':>5}{' '.join([nowArray[j][i] for j in range(5)])}" for i in range(5)]) # 列表解析每行字符数据并用“\n”拼接
#print(f"\n{lines}\n")



回页首


上一篇:  对AI的提问技艺(人工智能大行其道,如何借势?始于问询。要得要得预期,精于“提问技巧”)
下一篇: 



我的HOT博:

  本次共计收集 311 篇博文笔记信息,总阅读量43.82w。数据于2024年03月22日 00:50:22完成采集,用时6分2.71秒。阅读量不小于6.00k的有 7 7 7篇。


推荐条件 阅读量突破6.00k
(更多热博,请点击蓝色文字跳转翻阅)

  • 截屏图片
    在这里插入图片描述
      (此文涉及ChatPT,曾被csdn多次下架,前几日又因新发笔记被误杀而落马。躺“未过审”还不如回收站,回收站还不如永久不见。😪值此年底清扫,果断移除。留此截图,以识“曾经”。2023-12-31)



回页首


老齐漫画头像

精品文章:

来源:老齐教室


Python 入门指南【Python 3.6.3】


好文力荐:


CSDN实用技巧博文:


  • 22
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦幻精灵_cq

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值