Aus TTF-Datei jedes Zeichen als PNG-Datei ausgeben
-
- Beiträge: 216
- Registriert: Mo 3. Jan 2011, 13:34
- OS, Lazarus, FPC: Win11 (L 3.0 FPC 3.2.2)
- CPU-Target: 64Bit
- Wohnort: Nürnberg
Aus TTF-Datei jedes Zeichen als PNG-Datei ausgeben
Hallo,
ich habe folgendes Programm im Kopf (Konsole oder GUI ist erstmal egal) , weiß aber nicht, wie es mit FreePascal/Lazarus umzusetzen ist:
Gegeben ist eine Fontdatei im TTF-Format (z.B. ein Iconfont, oder jeder andere Font).
Aus dieser Fontdatei möchte ich jedes einzelne Zeichen, das darin enthalten ist, als einzelne PNG-Datei ausgeben.
Als Ausgabeparameter stelle ich mir vor:
- Größe (HöhexBreite) der PNG-Datei
- Schriftgrößte des Zeichens
- Schriftfarbe des Zeichens
- Hintergrundfarbe des PNGs = transparent
Mein Hauptproblem liegt darin, dass ich nicht weiß, wieviele und welche Zeichen in der TTF-Datei enthalten sind.
Zudem kann ich nicht voraussetzen, dass die TTF-Datei im Windowssystem installiert ist.
P.S. Die Aufgabenstellung klingt wie Hausaufgaben, aber ich bin 59 Jahre alt, und kein Schüler, der sich seine Hausaufgaben vom Lazarusforum erledigen lassen will.
Ich habe einfach keine Ahnung, wie ich in einer Schleife durch alle Zeichen eines TTF-Fonts laufen kann.
Gerade bei Icon-Fonts beginnen die interessanten Stellen erst bei UnicodeBereich  aber wie weit . Keine Ahnung.
Kann mir jemand helfen?
Meine Umgebung: Windows 10
ich habe folgendes Programm im Kopf (Konsole oder GUI ist erstmal egal) , weiß aber nicht, wie es mit FreePascal/Lazarus umzusetzen ist:
Gegeben ist eine Fontdatei im TTF-Format (z.B. ein Iconfont, oder jeder andere Font).
Aus dieser Fontdatei möchte ich jedes einzelne Zeichen, das darin enthalten ist, als einzelne PNG-Datei ausgeben.
Als Ausgabeparameter stelle ich mir vor:
- Größe (HöhexBreite) der PNG-Datei
- Schriftgrößte des Zeichens
- Schriftfarbe des Zeichens
- Hintergrundfarbe des PNGs = transparent
Mein Hauptproblem liegt darin, dass ich nicht weiß, wieviele und welche Zeichen in der TTF-Datei enthalten sind.
Zudem kann ich nicht voraussetzen, dass die TTF-Datei im Windowssystem installiert ist.
P.S. Die Aufgabenstellung klingt wie Hausaufgaben, aber ich bin 59 Jahre alt, und kein Schüler, der sich seine Hausaufgaben vom Lazarusforum erledigen lassen will.
Ich habe einfach keine Ahnung, wie ich in einer Schleife durch alle Zeichen eines TTF-Fonts laufen kann.
Gerade bei Icon-Fonts beginnen die interessanten Stellen erst bei UnicodeBereich  aber wie weit . Keine Ahnung.
Kann mir jemand helfen?
Meine Umgebung: Windows 10
-
- Beiträge: 216
- Registriert: Mo 3. Jan 2011, 13:34
- OS, Lazarus, FPC: Win11 (L 3.0 FPC 3.2.2)
- CPU-Target: 64Bit
- Wohnort: Nürnberg
Re: Aus TTF-Datei jedes Zeichen als PNG-Datei ausgeben
und bitte keine Hinweise auf Online-Dienste, oder externe Programme wie Imagemagik, oder FontForge.
Ich möchte einfach bei Freepascal/Lazarus bleiben und damit mein Problem lösen.
Vielleicht findet sich ja der eine oder andere Font-Spezialist hier im Forum
Ich möchte einfach bei Freepascal/Lazarus bleiben und damit mein Problem lösen.
Vielleicht findet sich ja der eine oder andere Font-Spezialist hier im Forum
- af0815
- Lazarusforum e. V.
- Beiträge: 6770
- Registriert: So 7. Jan 2007, 10:20
- OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
- CPU-Target: 32Bit (64Bit)
- Wohnort: Burgenland
- Kontaktdaten:
Re: Aus TTF-Datei jedes Zeichen als PNG-Datei ausgeben
Der hat u.a. folgende Funktionen
Code: Alles auswählen
{ Result is in pixels }
function TextWidth(const AStr: utf8string; const APointSize: single): single;
{ Result is in pixels }
function TextHeight(const AText: utf8string; const APointSize: single; out ADescender: single): single;
Grundlegend hat ein Font IMHO nach keine Farbe. Die wird erst später beim Zeichnen auf dem entsprechenden Kontext gesetzt.
Edit:
Das Singleton
Code: Alles auswählen
function gTTFontCache: TFPFontCacheList;
Doku auf englisch gibt es laut Sourcen auch: https://docs.microsoft.com/de-de/typogr ... type/spec/ schaut nicht unbedingt nach leichter Kost aus.
Dort sieht man auch den Aufbau von TTF. Das ist keine Rastergrafik geschichte sondern die definition ist ähnlich wie beim SVG. https://docs.microsoft.com/de-de/typogr ... ing_glyphs
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
Re: Aus TTF-Datei jedes Zeichen als PNG-Datei ausgeben
Irgendwie verstehe ich nicht genau, worum es dir geht und ein Font-Glyph hat die Farbe und die Grösse, die du ihm gibst bzw. anforderst.
Das gesagt: fcl-pdf hat auch mit direktem TTF-Font Zugriff zu tun.
Siehe z.B. fpparsettf
Vielleicht wirst du dort fündig.
Das gesagt: fcl-pdf hat auch mit direktem TTF-Font Zugriff zu tun.
Siehe z.B. fpparsettf
Vielleicht wirst du dort fündig.
-
- Beiträge: 118
- Registriert: Do 20. Jul 2017, 23:47
- OS, Lazarus, FPC: Win7 und Win10
- CPU-Target: xxBit
- Wohnort: Südheide (Schnuckenland)
Re: Aus TTF-Datei jedes Zeichen als PNG-Datei ausgeben
Mein spontaner Gedanke wäre sich die FreeType-Lib mal anzusehen.
https://de.wikipedia.org/wiki/FreeType
Nun ist es so, daß ich mal einen Delphi-Header für die FreeType-Lib entwickelt habe......das hilft dir also nicht weiter (weil der Header vorerst noch auf meiner Festplatte bleibt).
Aber mir ist so dunkel im Hinterkopp, daß Lazarus zu FreeType was intus hat. Ggf veraltet, aber du könnest mal schauen.
Ich glaube das verbirgt sich in den hier schon genannten fpttf-Kram.
Auf die schnelle fand ich den Thread "fpttf wie benutzen"
viewtopic.php?t=13535
Nachtrag: Ich hatten im Rahmen von OpenGL mir diesen FreeType-Header in Delphi entwickelt. In dem Projekt klappte das, daß ich aus einer Font-Datei die Dinger ausgelesen habe und ich meine als Bitmap via OpenGL auf den Bildschirm ausgab.
https://de.wikipedia.org/wiki/FreeType
Nun ist es so, daß ich mal einen Delphi-Header für die FreeType-Lib entwickelt habe......das hilft dir also nicht weiter (weil der Header vorerst noch auf meiner Festplatte bleibt).
Aber mir ist so dunkel im Hinterkopp, daß Lazarus zu FreeType was intus hat. Ggf veraltet, aber du könnest mal schauen.
Ich glaube das verbirgt sich in den hier schon genannten fpttf-Kram.
Auf die schnelle fand ich den Thread "fpttf wie benutzen"
viewtopic.php?t=13535
Nachtrag: Ich hatten im Rahmen von OpenGL mir diesen FreeType-Header in Delphi entwickelt. In dem Projekt klappte das, daß ich aus einer Font-Datei die Dinger ausgelesen habe und ich meine als Bitmap via OpenGL auf den Bildschirm ausgab.
- Winni
- Beiträge: 1577
- Registriert: Mo 2. Mär 2009, 16:45
- OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
- CPU-Target: 64Bit
- Wohnort: Fast Dänemark
Re: Aus TTF-Datei jedes Zeichen als PNG-Datei ausgeben
Hi!
Das war zu Ansi-Ascii-IBM8bit noch alles sehr einfach. Nur maximal 256 Zeichen ...
Es steht meines Wissens nirgendwo im TTF wie viele Glyphs implementiert sind.
Es stehen entweder dort die Glyph-Daten oder irgendeine "magische" NoGlyph-Kennung.
Dann gibt er entweder den NoGlyph-Salino aus oder NoGlyph-Zeichen mit den Hex-Werten in Mini-Schrift. Je nach TTF.
Der 4-Byte UTF8-Raum lässt 1.114.112 verschiedene Zeichen zu. Ich hab allerdings noch keinen Font gesehen, der alle UTF8-Blöcke abdeckt. Meistens fehlen Dinge wie "Cheerokee" oder "Musical Symbols".
Aber kyrillisch, griechisch, Thai, koreanisch, chinesisch, japanisch, Box-Drawing, Number Forms, Superscript & Subscript sind fast immer bei moderneren TTFs implementiert.
Ich denke, Du siehst Dir mal den UTF8-Wust genauer an und formulierst Deine Frage neu.
Hier ist eine vollständige Liste:
https://www.utf8-chartable.de/unicode-utf8-table.pl
Schlechtes HTML-Design: Die 3. Zeile von oben ist eine ComboBox mit allen UTF8-Code-Blocks.
Winni
Das war zu Ansi-Ascii-IBM8bit noch alles sehr einfach. Nur maximal 256 Zeichen ...
Es steht meines Wissens nirgendwo im TTF wie viele Glyphs implementiert sind.
Es stehen entweder dort die Glyph-Daten oder irgendeine "magische" NoGlyph-Kennung.
Dann gibt er entweder den NoGlyph-Salino aus oder NoGlyph-Zeichen mit den Hex-Werten in Mini-Schrift. Je nach TTF.
Der 4-Byte UTF8-Raum lässt 1.114.112 verschiedene Zeichen zu. Ich hab allerdings noch keinen Font gesehen, der alle UTF8-Blöcke abdeckt. Meistens fehlen Dinge wie "Cheerokee" oder "Musical Symbols".
Aber kyrillisch, griechisch, Thai, koreanisch, chinesisch, japanisch, Box-Drawing, Number Forms, Superscript & Subscript sind fast immer bei moderneren TTFs implementiert.
Ich denke, Du siehst Dir mal den UTF8-Wust genauer an und formulierst Deine Frage neu.
Hier ist eine vollständige Liste:
https://www.utf8-chartable.de/unicode-utf8-table.pl
Schlechtes HTML-Design: Die 3. Zeile von oben ist eine ComboBox mit allen UTF8-Code-Blocks.
Winni
- Winni
- Beiträge: 1577
- Registriert: Mo 2. Mär 2009, 16:45
- OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
- CPU-Target: 64Bit
- Wohnort: Fast Dänemark
Re: Aus TTF-Datei jedes Zeichen als PNG-Datei ausgeben
Hallo!
Noch ein paar Ergänzungen:
Intern sind die TTF-Daten wirklich ähnlich SVG: Es sind Bezier-Kurven.
Betr. eines Loops über alle UTF8-Zeichen
Ausgabe eines UTF8-Zeichens
Bespiel: Das µ (Micron) hat den Hex-Wert c2b5. Das kommt so auf den Bildschirm:
Irgendwo in der unit LazUTF8 steht auch wie man den CodePoint nach Hex umrechnet und umgekehrt.
Denn nicht jeder Hexwert ergibt einen legalen Codepoint.
Das sieht man schon an der Größe: 4 Byte ergeben 4 Millarden während in 4 UTF8-Bytes nur 1 Million Zeichen passen. Das liegt an der trickreichen Implementierung, um kaputte Streams lesen zu können. Ausserdem kann man schon an den ersten 3 Bits erkennen, im wievielten Byte eines UTF8-Zeichens man sich befindet. Da geht viel Speicher für die interne Verwaltung drauf.
Winni
Noch ein paar Ergänzungen:
Intern sind die TTF-Daten wirklich ähnlich SVG: Es sind Bezier-Kurven.
Betr. eines Loops über alle UTF8-Zeichen
Ausgabe eines UTF8-Zeichens
Bespiel: Das µ (Micron) hat den Hex-Wert c2b5. Das kommt so auf den Bildschirm:
Code: Alles auswählen
writeln (#$c2#$b5);
Denn nicht jeder Hexwert ergibt einen legalen Codepoint.
Das sieht man schon an der Größe: 4 Byte ergeben 4 Millarden während in 4 UTF8-Bytes nur 1 Million Zeichen passen. Das liegt an der trickreichen Implementierung, um kaputte Streams lesen zu können. Ausserdem kann man schon an den ersten 3 Bits erkennen, im wievielten Byte eines UTF8-Zeichens man sich befindet. Da geht viel Speicher für die interne Verwaltung drauf.
Winni
- af0815
- Lazarusforum e. V.
- Beiträge: 6770
- Registriert: So 7. Jan 2007, 10:20
- OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
- CPU-Target: 32Bit (64Bit)
- Wohnort: Burgenland
- Kontaktdaten:
Re: Aus TTF-Datei jedes Zeichen als PNG-Datei ausgeben
Ich glaube den Kirchfritz hats bereits ungehauen 

Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
Re: Aus TTF-Datei jedes Zeichen als PNG-Datei ausgeben
Vielleicht könnte man auch effizienter helfen, wenn Kirchfritz uns mitteilen würde, wozu das Ganze am Ende dienen soll.
Manchmal gibt es ja auch einfachere Wege zum Ziel.
-
- Beiträge: 216
- Registriert: Mo 3. Jan 2011, 13:34
- OS, Lazarus, FPC: Win11 (L 3.0 FPC 3.2.2)
- CPU-Target: 64Bit
- Wohnort: Nürnberg
Re: Aus TTF-Datei jedes Zeichen als PNG-Datei ausgeben
Hallo an alle, die mir bisher schon geantwortet haben.
Zuerst: Danke für alle Antworten!!!
Scheinbar haben die wenigsten verstanden, worum es mir geht.
Wie ich im Betreff dieses Beitrag eigentlich deutlich genug gesagt habe, möchte ich jedes Zeichen einer TTF-Datei als PNG-Datei ausgeben.
Was ist daran unverständlich?
in Pseudo-Code heißt das ungefähr so:
Lese Namen der TTF-Datei
Öffne TTF-Datei
Für jedes darin enthaltene Zeichen
--- Erstelle eine PNG-Datei, die genau dieses Zeichen enthält
--- Speichere die PNG-Datei im Filesystem
Schließe die TTF-Datei
Was ich bisher geschafft habe:
a) Mit Hilfe der fpttf Unit kann ich den PostscriptNamen aus der TTF-Datei auslesen. Den brauche ich zum Beispiel, wenn ich eine TTF-Datei habe, aber den Fontnamen (für z.B. Label.Font.Name) nicht kenne.
b) ich kann eine im Windows-System nicht registrierte TTF-Font-Datei mit AddFontRessource laden und am Programmende wieder freigeben.
Meine Problem sind:
a) Ich weiß nicht, wie ich die Schleife über alle Zeichen aus der TTF-Datei machen kann.
Ich könnte in einer For Schleife i von 1 bis $FFFF laufen lassen und dann mit TextOut(0,0,WideChar(i)) das Zeichen in einen Canvas ausgeben. Aber ich habe keine Ahnung, welche Zeichen von 1 bis $FFFF im Font wirklich enthalten sind.
b) Ich weiß noch nicht genau, wie ich ein PNG mit transparentem Hintergrund erstelle.
Vielleicht findet sich ja nochmal ein Spezialist, der mich versteht
Zuerst: Danke für alle Antworten!!!
Scheinbar haben die wenigsten verstanden, worum es mir geht.
Wie ich im Betreff dieses Beitrag eigentlich deutlich genug gesagt habe, möchte ich jedes Zeichen einer TTF-Datei als PNG-Datei ausgeben.
Was ist daran unverständlich?
in Pseudo-Code heißt das ungefähr so:
Lese Namen der TTF-Datei
Öffne TTF-Datei
Für jedes darin enthaltene Zeichen
--- Erstelle eine PNG-Datei, die genau dieses Zeichen enthält
--- Speichere die PNG-Datei im Filesystem
Schließe die TTF-Datei
Was ich bisher geschafft habe:
a) Mit Hilfe der fpttf Unit kann ich den PostscriptNamen aus der TTF-Datei auslesen. Den brauche ich zum Beispiel, wenn ich eine TTF-Datei habe, aber den Fontnamen (für z.B. Label.Font.Name) nicht kenne.
b) ich kann eine im Windows-System nicht registrierte TTF-Font-Datei mit AddFontRessource laden und am Programmende wieder freigeben.
Meine Problem sind:
a) Ich weiß nicht, wie ich die Schleife über alle Zeichen aus der TTF-Datei machen kann.
Ich könnte in einer For Schleife i von 1 bis $FFFF laufen lassen und dann mit TextOut(0,0,WideChar(i)) das Zeichen in einen Canvas ausgeben. Aber ich habe keine Ahnung, welche Zeichen von 1 bis $FFFF im Font wirklich enthalten sind.
b) Ich weiß noch nicht genau, wie ich ein PNG mit transparentem Hintergrund erstelle.
Vielleicht findet sich ja nochmal ein Spezialist, der mich versteht
-
- Beiträge: 216
- Registriert: Mo 3. Jan 2011, 13:34
- OS, Lazarus, FPC: Win11 (L 3.0 FPC 3.2.2)
- CPU-Target: 64Bit
- Wohnort: Nürnberg
Re: Aus TTF-Datei jedes Zeichen als PNG-Datei ausgeben
In Lazarus/Freepascal sieht das im Moment ungefähr so aus.
Hier fülle ich einfach die Caption eines Labels mit 801 Zeichen beginnend ab der Position $E000:
Als Ergebnis habe ich ein Label mit 801 Zeichen aus der TTF-Datei SAP-icons.ttf.
Ob in der TTF-Datei wirklich 801 Zeichen drin sind, oder nur 753 weiß ich nicht, ist dem Label aber egal.
Diese Sache mit dem Label ist nur provisorisch, damit ich überhaupt sicher sein kann, alles einigermassen richtig zu machen.
Gewünscht ist aber, dass ich am Ende lauter einzelne PNG-Dateien, für jedes Zeichen eine Datei, bekomme, und zwar genau soviele Dateien, wie Zeichen im TTF-Font drin sind.
Hier fülle ich einfach die Caption eines Labels mit 801 Zeichen beginnend ab der Position $E000:
Code: Alles auswählen
var
i : integer;
s : string;
myFontFile : String;
begin
myFontFile := UpperCase('SAP-icons.ttf');
ufk_fonts.dwFontAdd(myFontFile);
s := GetPostScriptName(MyFontFile);
Label3.Font.name := s;
Label3.Font.Size := 18;
s := '';
for i := 0 to 800 do
begin
s := s + WideChar($E001+i) +' ';
end;
Label3.Caption := s;
end;
Ob in der TTF-Datei wirklich 801 Zeichen drin sind, oder nur 753 weiß ich nicht, ist dem Label aber egal.
Diese Sache mit dem Label ist nur provisorisch, damit ich überhaupt sicher sein kann, alles einigermassen richtig zu machen.
Gewünscht ist aber, dass ich am Ende lauter einzelne PNG-Dateien, für jedes Zeichen eine Datei, bekomme, und zwar genau soviele Dateien, wie Zeichen im TTF-Font drin sind.
-
- Beiträge: 216
- Registriert: Mo 3. Jan 2011, 13:34
- OS, Lazarus, FPC: Win11 (L 3.0 FPC 3.2.2)
- CPU-Target: 64Bit
- Wohnort: Nürnberg
Re: Aus TTF-Datei jedes Zeichen als PNG-Datei ausgeben
Und hier noch eine kleine Impression, über welche Zeichen ich spreche: (siehe Anhang)
- Dateianhänge
-
- Zeichen.png (173.76 KiB) 1361 mal betrachtet
-
- Beiträge: 216
- Registriert: Mo 3. Jan 2011, 13:34
- OS, Lazarus, FPC: Win11 (L 3.0 FPC 3.2.2)
- CPU-Target: 64Bit
- Wohnort: Nürnberg
Re: Aus TTF-Datei jedes Zeichen als PNG-Datei ausgeben
Und hier einige Antworten, die ich bisher gefunden habe:
http://www.delphigroups.info/2/4d/416075.html
https://stackoverflow.com/questions/703 ... t-a-window
https://entwickler-ecke.de/topic_Charma ... 205,0.html
So richtig weitergeholfen hat mir das nicht.
http://www.delphigroups.info/2/4d/416075.html
https://stackoverflow.com/questions/703 ... t-a-window
https://entwickler-ecke.de/topic_Charma ... 205,0.html
So richtig weitergeholfen hat mir das nicht.
Re: Aus TTF-Datei jedes Zeichen als PNG-Datei ausgeben
Unverständlich ist, warum du das haben willst.kirchfritz hat geschrieben: Do 14. Jul 2022, 15:45 Wie ich im Betreff dieses Beitrag eigentlich deutlich genug gesagt habe, möchte ich jedes Zeichen einer TTF-Datei als PNG-Datei ausgeben.
Was ist daran unverständlich?
Was willst du denn mit 10'000en von PNGs anfangen?
Für mich ist das kein Ziel sondern allenfalls ein Weg zu einem Ziel. Aber welches?
Manchmal gibt es ja bessere Wege zum gleichen Ziel.
Ist wirklich nicht böse gemeint.
- af0815
- Lazarusforum e. V.
- Beiträge: 6770
- Registriert: So 7. Jan 2007, 10:20
- OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
- CPU-Target: 32Bit (64Bit)
- Wohnort: Burgenland
- Kontaktdaten:
Re: Aus TTF-Datei jedes Zeichen als PNG-Datei ausgeben
Gib mal den Beispiel Code oder zumindest die uses Zeile bekannt.
Nachdem du vom Font nichts gelesen hast, wirst du auch nichts erfahren. Damit man das machen kann, was du willst, muss man die Fontdatei einmal einlesen und die Grundparameter abfragen. in deinem Beispiel lässt du einfach einen Buchstaben ausgeben, aber hast keine Ahnung, was der Font wirklich ist oder macht.
fpttf ist schon der richtige Hebel. Nur Fonts sind keine Rastergrafiken, sondern normalerweise als Kurven gespeichert. Erst durch das Zeichnen auf einen Rastercanvas wird daraus etwas was du als PNG speichern kannst.
Nachdem du vom Font nichts gelesen hast, wirst du auch nichts erfahren. Damit man das machen kann, was du willst, muss man die Fontdatei einmal einlesen und die Grundparameter abfragen. in deinem Beispiel lässt du einfach einen Buchstaben ausgeben, aber hast keine Ahnung, was der Font wirklich ist oder macht.
fpttf ist schon der richtige Hebel. Nur Fonts sind keine Rastergrafiken, sondern normalerweise als Kurven gespeichert. Erst durch das Zeichnen auf einen Rastercanvas wird daraus etwas was du als PNG speichern kannst.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).