Какой формат шрифта это?

658
fstanis

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

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

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

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

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

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

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

3
[trid] (http://mark0.net/soft-trid-e.html) стоит попробовать Journeyman Geek 6 лет назад 0
Спасибо, только что попробовал - он распознал GBK32.FON как файлы Adobe Brush (ABR). Хотя фотошоп не согласен. Буду редактировать пост. fstanis 6 лет назад 0
В файле есть [шаблоны, видимые в представлении ASCII] (https://i.stack.imgur.com/yOzWG.png). Определенно выглядит растровое изображение. gronostaj 6 лет назад 0
Хороший улов! После гораздо большего количества поиска в Google, я мог найти что-то похожее: [font24.c] (https://github.com/cnoviello/stm32-discof7/blob/master/stm32-discof7-lcddim/Utilities/Fonts/font24.c ) fstanis 6 лет назад 0

2 ответа на вопрос

4
gronostaj

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

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

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

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

Спасибо, это именно так и работает! Фактически, файл содержит ровно 23940 символов, что соответствует количеству кодовых точек в диапазоне GBK. Немного поиграв, я смог создать FontAwesome .ФОН-версию, так что вот [несколько нетрадиционная форма благодарности] (https://i.stack.imgur.com/UIcad.jpg) (логотип SO является символ шрифта из моего нового шрифта). fstanis 6 лет назад 0
@fstanis Это самый уникальный способ сказать «спасибо», который я видел здесь: D Рад, что смог помочь! gronostaj 6 лет назад 0
1
Hayden James Dekker

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

Вытащить файл в 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(".*(.)$", "$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, зависит только от вас. Epd разрешает только три файла GBK32, GBK48 и GBK64. Я скопировал китайские глифы в начале верхнего 0x81, нижнего 0x80. Таким образом, T, который является ascii 0x54, становится 0x81, 0xD4.

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

Hayden

Похожие вопросы