Laden...

Auslesen von GDI+ Informationen aus TTF (True Type Fonts)

Erstellt von SlyFox vor 12 Jahren Letzter Beitrag vor 12 Jahren 3.273 Views
S
SlyFox Themenstarter:in
231 Beiträge seit 2007
vor 12 Jahren
Auslesen von GDI+ Informationen aus TTF (True Type Fonts)

Hallo,

ich habe gelesen, dass TTF (True Type Fonts) nichts anderes wären als komprimierte GDI+ Informationen.

Kann man diese mit C# auslesen, um sie dann selbst zu zeichnen?

Hintergrund ist ein Programm, mit dem ich chinesische Schriftzeichen zeichnen möchte. Dabei möchte ich nacheinander und in korrekter Schreibreihenfolge die Striche zeichnen, wobei jeder Strich eine andere Farbe erhalten soll.

Vielen Dank für eure Unterstützung

Christoph

6.862 Beiträge seit 2003
vor 12 Jahren

Hallo,

ich habe gelesen, dass TTF (True Type Fonts) nichts anderes wären asl komprimierte GDI+ Informationen.

Wo hast du das her? Und was meinst du mit GDI+ Informationen? In TTF werden die Outlines mit Hilfe von quadratischen B-Splines beschrieben, sprich mathematischen Funktionen um die Kurven eines Zeichens zu beschreiben. Sicher kann man mit diesen Informationen auch in GDI+ entsprechendes Zeichen selber zeichnen, aber prinzipiell hat das erstmal gar nichts mit GDI+ zu tun.

Ich würde auch bezweifeln das im Font die Strichreihenfolge irgendwie korrekt abgebildet ist. Da geht es darum, dass das Zeichen korrekt auf dem Bildschirm gerendert wird und nicht um die Strichreihenfolge. Ich hab mal für Kanjis ein entsprechendes Projekt im Internet gefunden, welches das Ziel hat, für alle Zeichen die Strichreihenfolge als XML Daten zur Verfügung zu stellen. Glaube auch, dass das fürs Chinesische auch ergänzt wurde, aber weiß spontan nicht mehr die Seite. Auf solche Daten würde ich mich aber eher stützen als versuchen zu wollen, aus dem Font irgendwas abzuleiten.

Baka wa shinanakya naoranai.

Mein XING Profil.

49.485 Beiträge seit 2005
vor 12 Jahren

Hallo SlyFox,

selberzeichnen ist vermutlich keine so gute Idee, weil viel von der Schriftqualität nicht durch die Vektoren, sondern durch die Hints kommt. Nach meinem Verständnis beziehen sich Hints nicht nur darauf, welche Pixel eingefärbt werden, sondern auch auf Abstände zwischen den Zeichen, insbesondere beim Auftreten bestimmter Zeichenkombinationen (siehe Unterschneidung und Ligatur). Insofern greifen Hints - im Gegensatz zu der Aussage auf Wikipedia - m.E. nicht nur bei Unterschreitung eines gewissen Mindest-Schriftgrades.

herbivore

C
1.214 Beiträge seit 2006
vor 12 Jahren

talla hat Recht, aber um deine Frage trotzdem zu beantworten - das geht, ist aber nicht ganz trivial. Die Daten zu einem Font kannst du dir über die GDI Funktion (nicht GDI+) GetFontData holen. Eine TTF Datei besteht aus verschiedenen Tabellen, die Strukturen sind im SDK nicht definiert, soweit ich weiß, das müsstest du selber machen. Im Buch "Windows Graphics Programming" ist es im Kapitel 14.4 ausführlich beschrieben. Da ist auch ein Beispiel, wo der Autor die Font Daten dekodiert und selber zeichnet. Und ich bin mir ziemlich sicher, dass es schon fertige Bibliotheken gibt, wenn nicht für C#, dann doch sicher für C/C++. Natürlich musst du auch beachten, was herbivoir gesagt hat. Wenn du einfach die B-Splines hinzeichnest, wirst du nicht die optimalen Ergebnisse bekommen.

Wegen der Strichreihenfolge... Keine Ahnung. Eigentlich könnte ich mir schon vorstellen, dass die Striche in korrekter Reihenfolge abgespeichert sind, weil sie in der chinesischen Schrift eine große Rolle spielen und die Leute, die die Fonts erstellen, das auch wissen. Muss aber natürlich nicht der Fall sein. Und was du von Hand als einen Stricht zeichnen würdest (oder zeichnen musst), besteht im Font vielleicht aus mehreren Strichen.
Ich bin mir zwar ziemlich sicher, dass man Tabellen finden kann, welches Zeichen mit welchen Strichen in welcher Reihenfolge gezeichnet werden muss, aber ich bin mir gar nicht sicher, ob man diese Informationen auch den Werten aus dem Font zuordnen kann. Ich könnte mir sogar vorstellen, dass man das über eine Heuristik relativ zuverlässig lösen könnte, aber so ohne weiteres wird es wohl nicht gehen...

771 Beiträge seit 2009
vor 12 Jahren

Hi zusammen,

die komplette True Type Spezifikation gibt es direkt bei MS unter Microsoft Typography - Features of TrueType and OpenType (Specifications) (etwas nach unten scrollen)

Interessant scheint auch die Font properties extension zu sein, mit der man sich detailliertere Infos zu (TT- bzw. OT-) Fonts direkt in Windows anzeigen lassen kann.

5.658 Beiträge seit 2006
vor 12 Jahren

Hallo allerseits,

es ist noch viel einfacher, die Font-Informationen direkt in Kurven bzw. Linien umzuwandeln:


GraphicsPath path = new GraphicsPath(); // System.Drawing.Drawing2D.GraphicsPath
path.AddString(text, new FontFamily(fontName), (int)style, 1.0f, new Point(0, 0), StringFormat.GenericTypographic);
path.Flatten(new Matrix(), accuracy);

Damit wandelt man einen Text mit einem bestimmten Font und Stil in Linien um, wenn man die letzte Zeile wegläßt, sind es Beziérkurven.

Das hat außerdem den Vorteil, daß die Abstände zwischen den einzlnen Buchstaben auch (typographisch) korrekt berechnet werden, was sehr schwierig ist, wenn man es selbst machen müßte.

Christian

Weeks of programming can save you hours of planning

6.862 Beiträge seit 2003
vor 12 Jahren

Hallo,

es geht ja nicht nur darum die Zeichen als Linien zu haben. Schwerpunkt war ja auch die Striche eines Zeichens

nacheinander und in korrekter Schreibreihenfolge zu erhalten und das ist nicht möglich, da diese Informationen nicht in einem Font stehen.

Eigentlich könnte ich mir schon vorstellen, dass die Striche in korrekter Reihenfolge abgespeichert sind, weil sie in der chinesischen Schrift eine große Rolle spielen ... Vollkommen korrekt das die Strichreihenfolge wichtig ist, aber ein Font beschreibt das Aussehen eines Zeichens, und nicht wie es gezeichnet werden muss, wenn man es per Hand schreibt.

Ich könnte mir sogar vorstellen, dass man das über eine Heuristik relativ zuverlässig lösen könnte Ne, das tut vorne und hinten nicht. Klar gibts gewisse Regeln wie die Strichreihenfolge normal sein sollte, aber es gibt bestimmt bald so viele Zeichen mit Ausnahmen wie Zeichen die streng die Regeln befolgen.

Baka wa shinanakya naoranai.

Mein XING Profil.

C
1.214 Beiträge seit 2006
vor 12 Jahren

Ich könnte mir sogar vorstellen, dass man das über eine Heuristik relativ zuverlässig lösen könnte
Ne, das tut vorne und hinten nicht. Klar gibts gewisse Regeln wie die Strichreihenfolge normal sein sollte, aber es gibt bestimmt bald so viele Zeichen mit Ausnahmen wie Zeichen die streng die Regeln befolgen.

So habe ich das nicht gemeint. Nehmen wir z.B. das Schriftzeichen für Haus. Jetzt braucht man eine Tabelle, in der drin steht, in welcher Reihenfolge welche Striche zu zeichnen sind. Und ich gehe stark davon aus, dass solche Tabellen existieren. Man schaut in die Tabelle und stellt fest, dass als erstes der kleine Strich links oben zu zeichnen ist. Jetzt könnte man alle aus der Font Datei ausgelesenen Kurven analysieren und die Wahrscheinlichkeit ermitteln, dass eine bestimmte Kurve dem kleinen Strich oben entspricht. Oder dem mittleren horizontalen Strich. Da es pro Zeichen nicht besonders viele Kurven sein werden, denke ich wird man das relativ sicher bestimmen können. Zumindest halte ich diesen Ansatz für denkbar.

6.862 Beiträge seit 2003
vor 12 Jahren

Okay, jetzt versteh ich es wie du es meinst. Die erste Hürde hierbei ist aber, überhaupt mal nen Font zu finden, der die einzelnen Striche der Zeichen definiert.

Ich habe mal ein Bild angehangen welches das Zeichen Haus (im Japanischen, ob im chinesischen das gleiche Zeichen verwendet wird weiß ich nicht) in drei verschiedenen Schriftarten nach MrSparkle's Vorschlag zeichnet um die Outlines darzustellen. In der Mitte wird der Windows Standardfont für Japanisch MS Mincho, und rechts der Standardfont für Chinesisch SimSun-ExtB verwendet. Wie man gut sieht sind die einzelnen Strokes nicht im Font enthalten! Es ist unmöglich daraus die einzelnen Striche, geschweige denn die Strichreihenfolge zu abzuleiten. Lediglich im Links dargestellten Font sind die einzelnen Strokes erkennbar.(Ist aber ein japanischer Font, fürs chinesische nicht verwendbar)

Baka wa shinanakya naoranai.

Mein XING Profil.

C
1.214 Beiträge seit 2006
vor 12 Jahren

Naja, unmöglich vielleicht nicht, aber auch nochmal ein gutes Stück umständlicher, als ich gedacht hätte. Da bräuchte man sogar eine zweite Ebene von Heuristik, um erkennen zu können (wieder aus den Strichinformationen zu den Zeichen), wie die Kurven zusammengehören. Dürfte aber immer noch machbar sein...

S
SlyFox Themenstarter:in
231 Beiträge seit 2007
vor 12 Jahren

Hallo,

erst mal ganz vielen Dank für eure Beiträge.

Allerdings gab es da ein kleines Missverständnis:

Die Reihenfolge in der die Striche (Strokes) auf Papier gezeichnet werden müssen, ist mir bekannt. Ich möchte dies in dem Bild auf dem Computer farblich darstellen. Ich muss lediglich die Kurven zu den einzelnen Strichen kennen, damit ich genau diesen Bereich farbig füllen kann. Jeder Strich muss demnach als geschlossenes Kurve vorliegen.

Wenn das nicht gewährleistet ist, muss ich mich nach einer anderen Lösung umschauen.

Vielen Dank für eure Hilfe

Christoph
(Kefu)