Aus TTF-Datei jedes Zeichen als PNG-Datei ausgeben

Für Fragen von Einsteigern und Programmieranfängern...
kirchfritz
Beiträge: 172
Registriert: Mo 3. Jan 2011, 13:34
OS, Lazarus, FPC: Win10 (L 3.0 FPC 3.2.2)
CPU-Target: 64Bit
Wohnort: Nürnberg

Aus TTF-Datei jedes Zeichen als PNG-Datei ausgeben

Beitrag von kirchfritz »

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 &#xE000 aber wie weit . Keine Ahnung.

Kann mir jemand helfen?

Meine Umgebung: Windows 10

kirchfritz
Beiträge: 172
Registriert: Mo 3. Jan 2011, 13:34
OS, Lazarus, FPC: Win10 (L 3.0 FPC 3.2.2)
CPU-Target: 64Bit
Wohnort: Nürnberg

Re: Aus TTF-Datei jedes Zeichen als PNG-Datei ausgeben

Beitrag von kirchfritz »

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

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6209
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

Beitrag von af0815 »

TTFCheck.zip
Testprogramm für den FontCache von fpReport
(1.28 KiB) 34-mal heruntergeladen
Als Anhaltspunkt würde ich mal in die Tiefen der FPC-Sourcen gehen. In der fpttf.pp (fpcsrc/packages/fcl-pdf/src/fpttf.pp) befindet sich die TTF-Font Verwaltung für den fpReport.

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;
vielleicht ist da etwas passendes dabei. Bzw. ein Anfang wo man suchen kann.

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;
gibt dir den FontCache zurück. Mit ReadStandardFonts (ev. BuildFontCache) wird der mit den defaults aufgebaut, das ist je nacht BS etwas anders. Bei SearchPath bekommt man eine StringList mit den Suchpfaden bzw. kann dort eigene eintragen.

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

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Aus TTF-Datei jedes Zeichen als PNG-Datei ausgeben

Beitrag von theo »

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.

TSchnuckenbock
Beiträge: 72
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

Beitrag von TSchnuckenbock »

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.

Benutzeravatar
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

Beitrag von Winni »

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

Benutzeravatar
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

Beitrag von Winni »

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:

Code: Alles auswählen

writeln (#$c2#$b5);
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

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6209
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

Beitrag von af0815 »

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

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Aus TTF-Datei jedes Zeichen als PNG-Datei ausgeben

Beitrag von theo »

af0815 hat geschrieben:
Mi 13. Jul 2022, 22:23
Ich glaube den Kirchfritz hats bereits ungehauen :-)
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.

kirchfritz
Beiträge: 172
Registriert: Mo 3. Jan 2011, 13:34
OS, Lazarus, FPC: Win10 (L 3.0 FPC 3.2.2)
CPU-Target: 64Bit
Wohnort: Nürnberg

Re: Aus TTF-Datei jedes Zeichen als PNG-Datei ausgeben

Beitrag von kirchfritz »

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

kirchfritz
Beiträge: 172
Registriert: Mo 3. Jan 2011, 13:34
OS, Lazarus, FPC: Win10 (L 3.0 FPC 3.2.2)
CPU-Target: 64Bit
Wohnort: Nürnberg

Re: Aus TTF-Datei jedes Zeichen als PNG-Datei ausgeben

Beitrag von kirchfritz »

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:

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;     
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.

kirchfritz
Beiträge: 172
Registriert: Mo 3. Jan 2011, 13:34
OS, Lazarus, FPC: Win10 (L 3.0 FPC 3.2.2)
CPU-Target: 64Bit
Wohnort: Nürnberg

Re: Aus TTF-Datei jedes Zeichen als PNG-Datei ausgeben

Beitrag von kirchfritz »

Und hier noch eine kleine Impression, über welche Zeichen ich spreche: (siehe Anhang)
Dateianhänge
Zeichen.png
Zeichen.png (173.76 KiB) 1069 mal betrachtet

kirchfritz
Beiträge: 172
Registriert: Mo 3. Jan 2011, 13:34
OS, Lazarus, FPC: Win10 (L 3.0 FPC 3.2.2)
CPU-Target: 64Bit
Wohnort: Nürnberg

Re: Aus TTF-Datei jedes Zeichen als PNG-Datei ausgeben

Beitrag von kirchfritz »

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.

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Aus TTF-Datei jedes Zeichen als PNG-Datei ausgeben

Beitrag von theo »

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?
Unverständlich ist, warum du das haben willst.
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.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6209
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

Beitrag von af0815 »

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.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Antworten