问题标签 [bitmap-fonts]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
411 浏览

fonts - 3.5" TFT LCD 上位图或光栅化字体位图和文本显示的差异

我使用的是 3.5:TFT LCD 显示器,带有 Arduino Uno 和制造商提供的库 KeDei TFT 库。该库带有一个位图字体表,对于 Arduino Uno 的少量内存来说它是巨大的,所以我一直在寻找替代品。

我遇到的是似乎没有标准的表示形式,我发现一些位图字体表工作正常,而另一些则显示为奇怪的涂鸦和标记,或者它们显示颠倒,或者它们显示时字母翻转。在编写了一个简单的应用程序来显示一些字符后,我终于意识到不同的位图使用不同的字符方向。

我的问题

位图字体的位数据的规则或标准或预期表示是什么?为什么位图字体似乎有几种不同的文本字符方向?

关于问题的想法

这些是否是由于不同的目标设备(例如 Windows 显示驱动程序或 Linux 显示驱动程序)与裸机 Arduino TFT LCD 显示驱动程序?

用于将特定位图字体表示确定为一系列无符号字符值的标准是什么?通过设置像素颜色在显示表面上绘图时,不同类型的光栅设备(例如 TFT LCD 显示器及其控制器)是否具有不同的位序列?

还有哪些其他可能的位图字体表示需要我的库版本当前不提供的转换?

除了我用来确定需要什么转换的方法之外,还有其他方法吗?我目前将位图字体表插入测试程序并打印出一组字符以查看其外观,然后通过使用 Arduino 和 TFT LCD 屏幕进行测试来微调转换。

到目前为止我的经验

KeDei TFT 库带有一个位图字体表,定义为

我并不完全熟悉位图字体的标​​准描述,但我认为这是一种 8x16 位图字体,其中每个字符的宽度为 8 像素,高度为 16 像素,或者是 8x16 位图字体。

由于这张表的大小和 Arduino Uno 上的少量内存,我开始寻找其他清晰易读的位图字体,同时占用更少的内存。请参阅减少用于 Arduino 的 3.5" TFT 显示器的 KeDei TFT 库所需的内存

我希望找到的是围绕 6x6 位图字体的东西,这样位图字体表的定义就会改变,const unsigned char font_table_16_col[96][16] = {从而const unsigned char font_table_16_col[96][6] = {释放大量内存。通过删除小写字母来减少表格的实验表明,这也有帮助。

寻找替代的位图字体比我想象的要困难,设想某人在 GitHub 存储库中的某个地方拥有位图字体的母体,通过一两次搜索很容易找到。

我遇到的是,虽然我发现了几个不同的位图字体示例,但似乎并非都与我特定的 3.5" TFT LCD 显示器兼容。

例如,这里是四种不同位图字体的表示,显示了两个字符的位图位,感叹号 (!) 和双引号 (")。5x8 似乎顺时针旋转了 90 度。8x8 和16x8 似乎方向正确,而 13x8 似乎颠倒了。

显示差异的位图字体样本的字符表示

生成上述位图表示

上图中的位图字体表示,显示了文本字符方向的差异,是由一个简单的 Windows GUI 生成的,并用一个短划线 (-) 表示位值 0 和一个星号 (*) 表示位值 1 . 这是 Microsoft Windows GUI 应用程序的输出,WM_PAINT其绘制显示图像的消息处理程序如下:

位图字体表的前几行如下:

转换字体位图以正确显示

我已经修改了使用位图字体显示文本的代码,以便对于特定的位图,字符绘制逻辑将在位图字体表示为一系列十六进制数字以及如何使用这一系列数字之间执行几种不同类型的转换确定打开哪些像素以及关闭哪些像素。

绘制单行字符的代码如下。该函数的概要是向 LCD 控制器提供一个矩形,指定要修改的显示区域,然后进行一系列两个 8 位写入,以设置该区域中每个像素的两字节 RGB565 颜色值。

使用上述函数绘制完整字符的源代码如下。此代码使用该drawGlyph()函数从上到下绘制一系列文本字符切片。何时完成位图转换取决于位图表示。

光栅或位图字体规范

有许多字体规范,包括光栅化位图类型字体。这些规范不一定描述在诸如 KeDei TFT 库之类的应用程序中使用的字形位图,而是提供与设备无关的位图字体格式描述。

字形位图分布格式

“BITMAP”开始当前字形的位图。这条线后面必须跟 Y 轴上每个像素的一条线。在这个例子中,字形是 16 像素高,所以后面有 16 行。每行包含一行中像素的十六进制表示。“1”位表示渲染像素。每行四舍五入到 8 位(一个字节)边界,右侧用零填充。在这个例子中,字形正好是 8 个像素宽,因此每行正好占据 8 位(一个字节),因此没有填充。一行栅格数据的最高有效位代表最左边的像素。

Oracle 在 Solarix X Window System Developer's Guide, Chapter 4 Font Support at https://docs.oracle.com/cd/E19253-01/816-0279/6m6pd1cvk/index.html有一个表格列出了几种不同的位图字体格式,并且这就是说:

如表 4-4 所示,许多位图字体文件格式是依赖于体系结构的二进制文件。它们不能在不同架构的机器之间共享(例如,在 SPARC 和 IA 之间)。

  • 位图分布格式,.bdf 文件,不是二进制文件,不是特定于架构的
  • 可移植的编译格式,.pcf 文件,二进制,不是特定于架构的
  • Little Endian 预建格式,二进制,架构特定
  • Big Endian 预建格式,二进制,架构特定

PSF(PC 屏幕字体),一种二进制规范,描述于 URL https://www.win.tue.nl/~aeb/linux/kbd/font-formats-1.html

PSF 代表 PC 屏幕字体。没有 Unicode 映射的 psf1 格式是 H. Peter Anvin 在 1989 年左右为他的 DOS 屏幕字体编辑器 FONTEDIT.EXE 设计的。1994 年 10 月,他添加了 Unicode 映射和程序 psfaddtable、psfgettable、psfstriptable 来操作它 - 参见 kbd-0.90。为了处理藏文,Andries Brouwer 在 1999 年 9 月增加了对 Unicode 值序列和 psf2 格式的支持 - 请参阅 kbd-1.00。

来自“早期 Microsoft 知识库文章存档”的 Microsoft Q65123 https://jeffpar.github.io/kbarchive/kb/065/Q65123/

Microsoft Windows 字体文件的格式是为光栅和矢量字体定义的。在某些 GDI 支持模块中,智能文本生成器可以使用这些格式。尤其是矢量格式,GDI 本身比支持模块更频繁地使用这些格式。

Metagraphics .fnt 字体文件规范https://www.metagraphics.com/metawindow/fonts/fnt-specs.htm

Microchip 图形库,Microchip 图形库中的 AN1182 字体 (PDF)

也可以看看

我在哪里可以找到 .fon 格式规范?

这个文件格式网站有几种不同字体规范的描述。https://docs.fileformat.com/font/fnt/

0 投票
0 回答
58 浏览

fonts - 有没有办法在网络浏览器中使用 BDF 位图字体?

在大多数 Linux 系统上,我们可以找到一系列 BDF 格式的位图字体:Fixed (misc-fixed)

我假设我们不能在浏览器中使用它们,因为缺少 BDF 字体格式。但也许有一些我不知道的聪明技巧或 JavaScript 库?