上一篇,写了通过照片生成版画。有评论说,可以用汉字试一下。所以研究了一下汉字的点阵。
点阵字体是把每一个字符都分成16×16,然后用每个点的虚实来表示字符的轮廓。点阵字体中,汉字是有16*16的0,1点阵构成,比如“啊”字,他的点阵如下:
有点看不太清,我用“■”代替1,“○”代替0:
这里我们用到了点阵字库,这是一个标准通用字库,如果需要,可以留言找我。
同时,还要了解GB2312的编码,关于编码的介绍,请看http://www.qqxiuzi.cn/zh/hanzi-gb2312-bianma.php
简单来说,GB2312编码是第一个汉字编码国家标准,由中国国家标准总局1980年发布,1981年5月1日开始使用。GB2312编码共收录汉字6763个,其中一级汉字3755个,二级汉字3008个。同时,GB2312编码收录了包括拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母在内的682个全角字符。
我们还需要利用binascii来实现16进制转换,他有两个方法,b2a_hex:二进制数据的十六进制;a2b_hex:b2a_hex的逆向函数。
准备工作完毕,开始上代码:
rect_list = [] * 16
for i in range(16):
rect_list.append([] * 16)
text = '啊'
gb2312 = text.encode('gb2312')
hex_str = binascii.b2a_hex(gb2312)
result = str(hex_str, encoding='utf-8')
area = eval('0x' + result[:2]) - 0xA0
index = eval('0x' + result[2:]) - 0xA0
offset = (94 * (area-1) + (index-1)) * 32
font_rect = None
with open("./font/hzk1216/HZK16", "rb") as f:
f.seek(offset)
font_rect = f.read(32)
for k in range(len(font_rect) // 2):
row_list = rect_list[k]
for j in range(2):
for i in range(8):
asc = font_rect[k * 2 + j]
flag = asc & KEYS[i]
row_list.append(flag)
for row in rect_list:
for i in row:
if i:
print('■',end=' ')
else:
print('○',end=' ')
print()
print()
这样就可以输出一个点阵的汉字“啊”了。
前面我们已经学会了如何驱动OLED显示屏,以及如何使用.NET nanoFramework来控制ESP32。在这篇文章中,我们将学习如何使用 IotByteFont 工具制作点阵字体,以及如何在ESP32中使用这些字体。工具开源地址:https://github.com/sangyuxiaowu/IotByteFont?wt.mc_id=DT-MVP-5005195
在物联网项目中,特别是使用 ESP32 这样的微控制器的项目中,点阵字体的使用非常普遍。这与我们最先的在 Jetson 设备中的示例不同,因为资源有限,我们不可能将整个字体文件放进去。针对大多数的项目,我们使用的特殊字符一般也没有那么多。
在 .NET nanoFramework 的项目中,也是使用的点阵字体,官方也提供了一些预置字库和图片转点阵的方法,但是没有直接使用自定义字体库的工具。为了解决这些问题,我创建了一个名为 IotByteFont 的 .NET 点阵字体制作工具。本文将详细介绍这个工具的功能和使用方法。
点阵字体是由像素点组成的字体,它们通常用于计算机屏幕或其他电子设备。每个字符都由一组点阵组成,这些点阵可以被编码成代码文件,然后由设备读取并显示。在 ESP32 中,我们通常使用 C 语言来编写这些代码文件,这些文件包含了定义每个字符点阵的数据。我们使用的 .NET nanoFramework 开发环境使用的是 C# 语言,这些点阵数据也是被编码为了 C# 代码文件。
点阵数据来源非常简单,我们只需要生成一个黑底白字的位图,然后将位图转换为点阵数据即可。中间经过的转换也非常简单,只需要先将位图进行二值化,然后将每个像素点转换为一个二进制位即可。然后,我们将这些二进制位组合成字节,最后将字节转换为十六进制编码即可。这样,我们就可以将字体数据编码为 C# 代码文件,然后在 .NET nanoFramework 项目中使用这些字体数据。如下图所示即是一个8x8的点阵字体的转换过程:
点阵字体转换过程然而,使用 IFont 这样的字库时,我们常常会遇到一些限制。例如,IFont 只能处理 8x8 或 16x16 的点阵字体。这意味着,如果你需要使用其他尺寸的字体,你就需要找到其他的解决方案。
IotByteFont 这个字体生成工具使用 .NET 平台,可以加载用户喜欢的字体文件,并生成自定义的点阵字体代码。对于需要自定义字体渲染的 IoT 项目,这个工具特别有用,适用于 .NET nanoFramework。
要安装 IotByteFont 工具,你可以通过以下命令:
dotnet tool install -g IotByteFont
使用 IotByteFont 字体生成工具非常简单。首先,你需要安装 .NET 平台。然后,你可以通过命令行来运行 IotByteFont,并提供必要的参数。例如,以下是一个基本的命令行示例:
IotByteFont --char "abcde"IotByteFont --char "chars.txt" --size 8IotByteFont --font ms.ttf --char chars.txt --yoffset 0.6 --name MyFont --debug
字体大小是默认的 16,你也可以指定为 8 ,这些都是兼容 IFont 的,可以直接在项目中使用。在这个示例中,--char 参数是字符文件的路径或字符字符串,--size 参数是字体大小,--font 参数是字体文件的路径或名称,--yoffset 参数是字体的 y 偏移,--name 参数是输出类的名称。打开调试模式可以打印调试信息和最终字体的位图。
debug位图这里也有一些开源字体的推荐,比如点阵字体 unifont 和阿里巴巴普惠体等一系列优秀的字体。
由于目前 nanoFramework.Iot.Device.Ssd13xx 的限制,字体大小宽度必须是 8 或者 16,所以如果你需要使用其他大小的字体,你可以使用特殊的方法来显示。这个方法允许你显示字体宽*高度为8的倍数的任何大小字体。
public static void DarwString(Ssd13xx device, int x, int y, string str, byte size = 1){ int inx = 0; int fontWidth = device.Font.Width; int fontHeight = device.Font.Height; int fontWidthTimesSize = fontWidth * size; int fontArea = fontWidth * fontHeight; byte[] bitMap = new byte[fontArea]; foreach (char c in str) { // 字体数据 device.Font.Width * device.Font.Height 的 16 进制数据 byte[] charBytes = device.Font[c]; for (int i = 0; i < charBytes.Length; i++) { byte b = charBytes[i]; int baseIndex = i * 8; for (int j = 0; j < 8; j++) { // 获取二进制位 int bit = (b >> j) & 1; // 存储二进制位到位图数组 bitMap[baseIndex + j] = (byte)bit; } } // 按照字体大小从左到右,从上到下绘制位图 int baseX = x + fontWidthTimesSize * inx; for (int i = 0; i < fontHeight; i++) { int baseY = y + i * size; for (int j = 0; j < fontWidth; j++) { // 获取二进制位 int bit = bitMap[i * fontWidth + j]; // 根据size绘制像素或填充矩形 if (size == 1) { device.DrawPixel(baseX + j * size, baseY, bit == 1); } else { device.DrawFilledRectangle((baseX + j * size), baseY, size, size, bit == 1); } } } inx++; }}
以下是一个调用方式示例:
using Ssd1306 device = new Ssd1306(I2cDevice.Create(new I2cConnectionSettings(1, Ssd1306.DefaultI2cAddress)), Ssd13xx.DisplayResolution.OLED128x64);device.ClearScreen();device.Font = new IotByteFont();DarwString(device, 2, 32, "桑榆肖物", 2);DarwString(device, 0, 0, "IotByteFont", 1);device.Display();
点阵字体在 ESP32 等设备中起着重要的作用,然而,生成这些字体并不总是那么简单。幸运的是,有了像 IotByteFont 这样的工具,我们可以更容易地生成我们需要的点阵字体。通过理解点阵字体的原理,以及如何使用 IotByteFont,我希望你现在可以更好地处理你的 ESP32 项目中的字体问题。
相关问答
通过撰写代码来实现。Proteus中只有5×7和8×8等LED点阵,并没有16×16LED点阵,而在实际应用中,要良好地显示一个汉字,则至少需要16×16点阵。下面我们就首先...
很好,我无法确定“数学由点组成的字体”是什么。不过,可以肯定的是,字体是指文字的样式和尺寸,而数学是由符号和数字组成的,与字体没有直接关系。因此,无法...
分享汉字字型码又称汉字字模,用于汉字在显示屏或打印机输出。汉字字型码通常有两种表示方式:点阵和矢量表示方法。用点阵表示字型时,汉字字型码指的是这个汉字...
三项:打印分辨率,打印...打印机(Printer)是计算机的输出设备之一,用于将计算机处理结果打印在相关介质上。衡量打印机好坏的指标有三项:打印分辨率,打印速度...
自“种草”一词的出现,各平台的美妆博主/娱乐博主/穿搭博主……纷纷晒出了自己的“美丽小秘方”,煞有介事地介绍自己光滑细嫩的肌肤都是源于这些“民间偏方”或...
脸上挤痘痘挤的留下痘印了,我想咨询一下痘印怎样消除?
在‘文件’-‘常用图库’里有各种图形可以选,想做浮雕的话,灰度图可以到网上收索,然后‘文件’--‘输入点阵图像’,‘艺术曲面’--‘图像纹理’--‘位图转...
朋友的嘴唇上有疤痕,一直觉得很难受,请问嘴唇疤痕修复有哪些办法?
[回答]这里有上百种字库要那种自己找http://www.yesadmin.com/Soft/html/36/398/~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~汉字...
感谢邀请~接下来由我来回答一下这个问题。痘痘挤破之后流出来的白色液体,其实是这3种东西:(1)脂肪酸主要是由于皮脂分泌过度形成的,皮脂腺释放出很多游离...