3

E Ink Display, который я купил, поддерживает отображение текста с помощью встроенной команды. Согласно документации, он также позволяет загружать другую "библиотеку шрифтов" для китайских символов:

Библиотеки шрифтов

Встроенный в систему 32, 48 и 64 точки английский шрифт всегда доступен без использования TF-карты или NandFlash; однако, для китайского шрифта с 32, 48 и 64 точками, вы должны сохранить соответствующий файл библиотеки на TF-карту или NandFlash перед его использованием.

Я нашел образец одного из этих файлов шрифтов в библиотеке GitHub для этого дисплея: GBK32.FON, GBK48.FON и GBK64.Фон

К сожалению, это так далеко, как я получил.

  • 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)

  • TrID выводит 100.0% (.ABR) Adobe PhotoShop Brush (1002/3) , однако мне не удалось открыть файлы в Photoshop

  • PSFTools не распознает его как действительную Windows.FON или.Файл FNT

  • Шестнадцатеричный редактор показывает, что магического числа не существует - фактически, первые 15 байтов во всех трех файлах - это просто нули

  • Судя по размеру файлов, файлы представляют собой какие-то растровые изображения (размер GBK32.FON / 32 ^ 2 = размер GBK48.FON / 48 ^ 2 = размер GBK64.FON / 64 ^ 2)

Есть ли "известный" растровый шрифт, который может соответствовать этому описанию? Что еще я мог попытаться выяснить этот формат?

2 ответа2

4

Я предположил, что символы - это черно-белые растровые изображения постоянных размеров. Наиболее примитивным кодированием было бы сохранение каждых 8 последовательных пикселей в виде битов в одном байте. Это просто, не очень требовательно к производительности и имеет большое преимущество в том, что все символы имеют одинаковое количество байтов в длину, так что вы можете предсказуемо перейти к любому символу, который вам нужен.

Я взломал простой скрипт на Python, чтобы проверить эти предположения. Он обрабатывает эти файлы, заменяя каждый байт 8-символьными строками, состоящими из (пробел) и # соответственно для 0 и 1 битов в порядке с прямым порядком байтов. Это делает выходные файлы видимыми в любом текстовом редакторе, который может обрабатывать файлы такого размера. Вот код и вот обработанный GBK32.FON с переносом строки в 32 символа:

Четко видимый глиф символа, состоящего из #s

Как вы уже догадались, высота глифа составляет 32 пикселя.

1

Боже мой! Я пошел просить о помощи, но всплыла подсказка со словами: не просите помощи ... хе-хе, через три дня я сделал это сам, поэтому решил поделиться несколькими дополнительными советами.

Вытащить файл в 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, чтобы установить интервал как. Для этого команда "Текст" становится 4 отдельными командами ((x0, y0, "T"), (x0 + width "T", y0 "e") и т.д.), И каждый символ затем преобразуется в китайский формат. Относительно того, где вы размещаете глифы в ваших файлах GBK, зависит только от вас. Эпд допускает только три файла GBK32, GBK48 и GBK64. Я скопировал китайские символы в начале 0x81, ниже 0x80. Таким образом, T, который равен 0x54, становится 0x81, 0xD4.

Надеюсь, поможет

Hayden

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .