Welches Schriftformat ist das?

660
fstanis

Eine von mir erworbene E-Ink-Anzeige unterstützt die Anzeige von Text mithilfe eines integrierten Befehls. Laut Dokumentation kann ich auch eine andere "Schriftbibliothek" für chinesische Zeichen laden:

Schriftbibliotheken

Die in das System integrierte englische Schriftart mit 32, 48 und 64 Punkten ist immer verfügbar, ohne die TF-Karte oder den NandFlash zu verwenden. Für die chinesische Schrift mit 32, 48 und 64 Punkten sollten Sie jedoch die relative Bibliotheksdatei auf der TF-Karte oder dem NandFlash speichern, bevor Sie sie verwenden.

Ich habe ein Beispiel für eine dieser Schriftartdateien in einer GitHub-Bibliothek für diese Anzeige gefunden: GBK32.FON, GBK48.FON und GBK64.FON .

Leider ist das so weit wie ich gekommen bin.

  • fileproduziert nichts Nützliches ( GBK32.FON: data)

  • FontForge gibt mir nur einen Fehler: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- Ausgaben 100.0% (.ABR) Adobe PhotoShop Brush (1002/3), jedoch konnte ich die Dateien nicht in Photoshop öffnen

  • PSFTools erkennt es nicht als gültige Windows-.FON- oder .FNT-Datei

  • Ein Hex-Editor zeigt an, dass es keine magische Zahl gibt - tatsächlich sind die ersten 15 Bytes in allen drei Dateien nur Nullen

  • Basierend auf der Größe der Dateien scheint es sich bei den Dateien um eine Art Bitmaps zu handeln (Größe von GBK32.FON/ 32 ^ 2 = Größe von GBK48.FON/ 48 ^ 2 = Größe von GBK64.FON/ 64 ^ 2)

Gibt es eine "bekannte" Bitmap-Schriftart, die möglicherweise zu dieser Beschreibung passt? Was könnte ich sonst versuchen, dieses Format herauszufinden?

3
[trid] (http://mark0.net/soft-trid-e.html) könnte einen Versuch wert sein Journeyman Geek vor 6 Jahren 0
Danke, habe es gerade ausprobiert - GBK32.FON wurde als Adobe Brush (ABR) -Datei erkannt. Photoshop stimmt dem jedoch nicht zu. Wird den Beitrag bearbeiten. fstanis vor 6 Jahren 0
Es gibt [Muster in der ASCII-Ansicht] (https://i.stack.imgur.com/yOzWG.png) der Datei. Definitiv sieht Bitmap-ish aus. gronostaj vor 6 Jahren 0
Guter Fang! Nach vielem googeln habe ich vielleicht etwas Ähnliches gefunden: [font24.c] (https://github.com/cnoviello/stm32-discof7/blob/master/stm32-discof7-lcddim/Utilities/Fonts/font24.c ) fstanis vor 6 Jahren 0

2 Antworten auf die Frage

4
gronostaj

Ich nahm an, dass Zeichen Schwarzweiß-Bitmaps mit konstanten Abmessungen sind. Die einfachste Codierung würde darin bestehen, alle 8 aufeinanderfolgenden Pixel als Bits in einem einzelnen Byte zu speichern. Es ist einfach, nicht sehr anstrengend und hat den großen Vorteil, dass alle Zeichen dieselbe Anzahl von Bytes haben, sodass Sie vorhersagbar zu dem gewünschten Zeichen springen können.

Ich habe ein einfaches Python-Skript gehackt, um diese Annahmen zu testen. Er verarbeitet diese Dateien und ersetzt jedes Byte durch 8-stellige Zeichenketten, die aus (Leerzeichen) und #für 0und 1Bits in Big-Endian-Reihenfolge bestehen. Dadurch können Ausgabedateien in jedem Texteditor angezeigt werden, der solche Dateien verarbeiten kann. Hier ist der Code und hier ist das verarbeitete GBK32.FON mit Zeilenumbruch auf 32 Zeichen gesetzt:

Deutlich sichtbare Glyphe eines aus #s bestehenden Zeichens

Wie Sie vielleicht schon vermutet haben, ist die Glyphe 32 Pixel hoch.

Vielen Dank, genau so funktioniert es! Tatsächlich enthält die Datei genau 23940 Glyphen, die der Anzahl der Codepunkte im GBK-Bereich entsprechen. Mit ein bisschen herumspielen konnte ich eine .FON-Version von FontAwesome erstellen, daher hier eine etwas unkonventionelle Form des Dankes (https://i.stack.imgur.com/UIcad.jpg) (das SO-Logo ist ein Schriftzeichen aus meiner neuen Schrift). fstanis vor 6 Jahren 0
@fstanis Das ist die einzigartigste Art, "Danke" zu sagen, die ich hier gesehen habe: D Ich bin froh, dass ich helfen konnte! gronostaj vor 6 Jahren 0
1
Hayden James Dekker

Meine Güte! Ich bat um Hilfe, aber es wurde eine Hinweisbox angezeigt, die nicht zu bitten bat, um Hilfe zu bitten ... hehe also, drei Tage später habe ich es selbst gemacht, also dachte ich, ich hätte ein paar zusätzliche Tipps.

Das Ziehen der Datei in Java ist ziemlich einfach.

Um die Glyphen zu importieren verwenden (Pseudo - Code) ,

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 

Anzeige der Glyphen auf der EPD

Nachdem Sie ein wenig herumgespielt haben, müssen Sie für jedes Zeichen zwei Bytes an die EPD senden. Diese Zeichen beginnen bei (oberes Byte) 0x81, (unteres Byte) 0x40.

Dies ist eine gute Referenz, https://en.wikipedia.org/wiki/GBK, um zu sehen, wie der GBK-Datensatz aufgebaut ist. Eine weitere hilfreiche Referenz sind diese https://r12a.github.io/apps/encodings/

Erstellen einer benutzerdefinierten Schriftart (Pseudocode)

Laden Sie eine .ttf-Datei herunter und öffnen Sie sie in 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); 

Der characterWidthLogger () ist wichtig. Auf dem Mikro, das die EPD steuert, verwende ich die Zeichenbreite-Karte, um den Abstand als festzulegen. Aus einem "Text" -Befehl werden daher 4 separate Befehle ((x0, y0, "T"), (x0 + Breite 'T ", y0" e ") usw.), und jedes Zeichen wird dann in das chinesische Format konvertiert Wo Sie die Glyphen in Ihre GBK-Dateien einfügen, liegt ganz bei Ihnen. Die epd-Datei erlaubt nur die drei Dateien GBK32, GBK48 und GBK64 0x81, 0xD4.

Ich hoffe es hilft

Hayden