Aus TTF-Datei jedes Zeichen als PNG-Datei ausgeben

Für Fragen von Einsteigern und Programmieranfängern...
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!

Also transparente PNG Dateien geht mit der BGRAbitmap recht einfach.
Die gewünschte Font Datei zuweisen auch.

Code: Alles auswählen

uses .... BGRAbitmap, BGRAbitmapTypes;
....

var bmp: TBGRAbitmap;
begin
bmp := TBGRAbitmap.create(Breite,Hoehe); // Ohne  Farb-Parameter wirds transparent
bmp.FontName  := 'Arial';
bmp.FontQuality:=   fqFineAntialiasing;
bmp.FontHeight := 24;
bmp.TextOut (1,1,'ABCDEFG',cssMidnightBlue, taLeftJustify);
bmp.saveToFile('Buchstaben.png');
bmp.free;


Zum Farbparameter be TBGRAbitmap.create:

Die Standardform ist

Code: Alles auswählen

TBGRAbitmap.create(Breite,Hoehe, Farbe);
Es gibt aber auch die oben gezeigte Version ohne Farbparameter.
Die erzeugt eine transparente Bitmap:

Code: Alles auswählen

TBGRAbitmap.create(Breite,Hoehe);
Winni

sstvmaster
Beiträge: 576
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: W10, L 2.2.6
CPU-Target: 32+64bit
Wohnort: Dresden

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

Beitrag von sstvmaster »

@kirchfritz,

meinst du so was wie er hier gemacht hat?
- https://en.delphipraxis.net/topic/5504- ... rendering/

Siehe letzter Beitrag und Link.
LG Maik

Windows 10,
- Lazarus 2.2.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 2.2.7 (fixes) + fpc 3.3.1 (main/trunk)

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!

Da kirchfritz sich nicht weiter mit der internen Struktur von UTF8 belasten will, erhöre ich mal seinen Wunsch nach einer brut force Lösung.

Es gibt folgende Function in der unit LazUTF8:

Code: Alles auswählen

function UnicodeToUTF8(
  CodePoint: Cardinal;
  Buf: PChar
):Integer;
CodePoint: ist ein Unsigned Integer zwischen 0 und $FFFFFFFF
In Buf wird das gewünschte UTF8 Zeichen abgelegt - falls es das gibt
Der Rückgabewert ist ein Wert zwischen 0 und 4 und gibt dieLänge des UTF8 Zeichen (im Buf) in Byte an. Fall der Wert 0 ist, dann gibt's das Zeichen nicht und es wird eine Exception ausgelöst.
Also sollte man diese function in einem Try-Block verwenden und die Exception abfangen.

Zu bedenken ist also: Wenn man wirklich die Schleife von 0 bis $FFFFFFFF laufen lässt, so lopt er 4 Milliarden mal, gibt aber nur 1 Million valide Resultate. Dabei löst er dann
4*10^9 - 1*10^6
mal eine Exception aus.

Ich hoffe es gibt einen schnellen Rechner.
Oder doch mal mit der internen Struktur von UTF8 beschäftigen??

Winni

Benutzeravatar
six1
Beiträge: 788
Registriert: Do 1. Jul 2010, 19:01

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

Beitrag von six1 »

:lol: :lol: :lol: Font-Brute-Forcing cool
Gruß, Michael

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 »

kirchfritz hat geschrieben:
Do 14. Jul 2022, 15:45
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.
Hallo!

Dein Problem 2 hab ich Dir mit der BGRAbitmap gelöst.

Dein Problem 1 ist dein falsches Verständnis des TTF-Fonts.
Ein TTF-Font enthält keine Infos über die Anzahl der vorhandenen Glyphs.
Ein TTF-Font enthält ein

[Pseudocode]

array of
record
Cp: Codepoint;
Data: array of Becier;
end;

Ist der Codepoint vorhanden, wird das zugehörige Glyph angezeigt.
Andernfalls das NoGlyph-Substitute

Erschwerend kommt hinzu:

Bei U+E000 fängt die "Private Use Area" an. Da ist nix normiert. Da kann jeder reinbasteln, was er möchte. Genaueres können Dir nur die Macher des TTF sagen.

Und Dein Rumgeeier lasst vermuten, das der Font "SAP-icons" copyright geschützt ist und nicht billig ist.

Dein Ansatz, die Codepoints über den widestring-manager ausgeben zu lassen, ist richtig.

Alle anderen Infos erhältst Du nur über trial and error.

Winni

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

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

Beitrag von Socke »

Winni hat geschrieben:
Do 14. Jul 2022, 21:05
Und Dein Rumgeeier lasst vermuten, das der Font "SAP-icons" copyright geschützt ist und nicht billig ist.
Wenn du die unter der APL 2.0 lizenzierte Version im woff2-Format selbst nach TTF konvertierst, hast du keine Probleme.

Nachtrag: In der SAPUI5 Bibliothek kann man sich auch alle Icons ansehen und als TTF herunterladen. Dort gilt aber eine andere Lizenz!
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Antworten