这是什么字体格式?

这是什么字体格式?

一个电子墨水显示屏我购买的它支持使用内置命令显示文本。根据文档,它还允许我为中文字符加载不同的“字体库”:

字体库

系统内置的32、48、64点英文字库无需使用TF卡或NandFlash即可使用;但32、48、64点中文字库则需要先将相应的库文件存放到TF卡或NandFlash中才能使用。

我在 GitHub 库中找到了用于此显示的其中一个字体文件的示例:GBK32字体繁體中文繁體中文

不幸的是,这就是我所能得到的。

  • file不产生任何有用的结果(GBK32.FON: data

  • FontForge只是给了我一个错误:GBK32.FON is not in a known format (or uses features of that format fontforge does not support, or is so badly corrupted as to be unreadable)

  • 特尔 ID输出100.0% (.ABR) Adobe PhotoShop Brush (1002/3),但是我无法在 Photoshop 中打开文件

  • PSF工具无法将其识别为有效的 Windows .FON 或 .FNT 文件

  • 十六进制编辑器显示没有神奇的数字——事实上,这三个文件的前 15 个字节都是零

  • 根据文件的大小,这些文件似乎是某种位图(大小为GBK32.FON/ 32^2 = 大小为GBK48.FON/ 48^2 = 大小为GBK64.FON/ 64^2)

是否有任何“已知”的位图字体可能符合此描述?我还能尝试什么来弄清楚这种格式?

答案1

我假设字符是恒定尺寸的黑白位图。最原始的编码是将每 8 个连续像素存储为单个字节中的位。它很简单,对性能要求不高,并且具有所有字符长度相同(因此您可以有预见地跳转到所需的任何字符)的巨大优势。

我编写了一个简单的 Python 脚本来测试这些假设。它处理这些文件,将每个字节替换为由(空格) 和组成的 8 个字符串,#分别用于大端顺序的01位。这使得输出文件可以在任何可以处理如此大文件的文本编辑器中查看。以下是代码以下是处理后的 GBK32.FON,其换行设置为 32 个字符:

清晰可见的由 #s 组成的字符的字形

您可能已经猜到了,该字形高 32 像素。

答案2

天哪!我去寻求帮助,但弹出了一个提示框,上面写着不要寻求帮助……呵呵,三天后我自己也这么做了,所以我想分享一些额外的提示。

将文件拉入 Java 非常容易。

要导入字形,请使用(伪代码)

BufferedInputStream bf = new BufferedInputStream(importGBKFileStream);

byte glyphline[] = new byte[glyphBitWith/8];  // 64 for GBK 64

while (bf.available() > 0) {

bf.read(glyphline);
for(int i = 0 ; i < glyphline.length ; i++){

String s = ("0000000" + Integer.toBinaryString(0xFF & glyphline[i])).replaceAll(".*(.{8})$", "$1");

... etc

在 EPD 上显示字形

经过一番尝试,您需要为每个字符向 EPD 发送两个字节。这些字符从 (高字节) 0x81、(低字节) 0x40 开始。

这是一个很好的参考,https://en.wikipedia.org/wiki/GBK了解 GBK 数据集的布局方式。另一个有用的参考资料是这些 https://r12a.github.io/apps/encodings/

创建自定义字体(伪代码)

下载 .ttf 文件,并在 java 中打开

    Font font = Font.createFont(Font.TRUETYPE_FONT, inttf);
    font = font.deriveFont((float) 64); 

    // for all characters in ASCII table

    text = Character.toString(chara);

    img = new BufferedImage(imageWidth, imageHeight, BufferedImage.TYPE_BYTE_BINARY);
    g2d = img.createGraphics();

    g2d.setColor(Color.BLACK);
    g2d.fillRect(0, 0, imageWidth, imageHeight);
    g2d.setColor(Color.WHITE);
    g2d.setFont(font);
    fm = g2d.getFontMetrics();

    // for all ascii values 0 - 256,  xpos
    g2d.drawString(text, 0, fm.getAscent());

    // use the character and the derrived with from the FontMetrics to
    // create a map for spacing the text manually                         
    characterWidthLogger(chara, textWidth);

    // should have the image as a dataByte buffer
    WritableRaster raster = img.getRaster();
    DataBufferByte data   = (DataBufferByte) raster.getDataBuffer();

    // output the data to a file or screen                                 
    displayByteArray(data ,imageHeight, imageWidth);

characterWidthLogger() 很重要。在控制 EPD 的微机上,我使用 characterWidth 映射来设置间距。因此,“Text”命令变为 4 个单独的命令((x0, y0, "T"),(x0 + width 'T", y0 "e") 等),然后每个字符都转换为中文格式。至于在 GBK 文件中放置字形的位置由您决定。epd 仅允许三个文件 GBK32、GBK48 和 GBK64。我复制了开头的中文字形,上部 0x81,下部 0x80。因此 T 即 ascii 0x54 变为 0x81、0xD4。

希望能帮助到你

海登

相关内容