Re: Denkhilfe Fonts/MySQL

Joerg Rossdeutscher <[email protected]>
Newsgroups gmane.linux.suse.programming
Message-ID <1104055649.3393.26.camel@ratti>
Moin,

Am Samstag, den 25.12.2004, 23:24 +0100 schrieb Kai Hauser:
> Joerg Rossdeutscher schrieb:
> >Am Samstag, den 25.12.2004, 20:41 +0100 schrieb Kai Hauser:
> >Ne, möchte ich eben nicht. Es gibt ja nur einen Fingerprint pro Font -
> >also bei 400.000 Fonts ebensoviele Fingerprints.
> >  
> >
> du hattest geschrieben: "mit Werten von 00 bis 99" nicht mit 3 Werten 
> (00,50,99)

00,50,99 sind nur Beispiele gewesen. Ich definier den Fingerprint jetzt
mal ganz genau. Er hat genau die Form:

XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX

wobei jedes XX-Pärchen ein Integer zwischen(!) 0 und 99 ist.


> >Naja, das Aussehen eines Fonts kann man eben nicht in einer einfach Zahl
> >speichern.
> >  
> >
> Sicher kann man das, für die CPU sind Fonts auch nur Zahlen (0,1) und 
> außerdem
> die ganze Welt besteht nur aus Zahlen (den Film PI gesehn?) ;-) 

Der ganz Font besteht aus Zahlen. :-)

Allerdings müssen diese Zahlen wohl in eine genehmere Form gewandelt
werden, jedenfalls solange, bis MySQL v99.9 einen Query erlaubt wie:

SELECT fonts WHERE look_like_the_image SCAN.PNG

:-)


> >Das Bild wird jetzt unproportional gezerrt, bis es genau 128x128 Pixel
> >groß ist.
> >  
> >
> geht daruch nicht der Font "kaputt"?
> Wie erkennt man da noch den Unterschied zw zb einem o und einer 0, 
> unproportional gezerrt sehn die in etwa gleich aus oder?

Mehrere Dinge:

1.
Die Routine erlaubt mir, von einem gescannten Text den abgebildeten Font
zu ermitteln. Da man in jeder DTP-Software an Schriften "rumziehen"
kann, ist die Möglichkeit größer, daß das Original erkannt wird.

2.
Oft hilft eine Fehlerkennung trotzdem weiter. Die Routine matcht ja nur
auf Fonts, die man besitzt, und wenn ein Bild auf "Helvetica Condensed"
matched, obwohl auf dem Bild definitv eine "Regular" zu sehen ist,
brauche ich mir nur das Schriftmuster des Herstellers im Internet
anzusehen, und das kann ich dann kaufen.

3.
Die Routine erlaubt auf diese Weise eine gewisse Vorsortierung, bei der
der Rechner ohne manuellen Eingriff erkennt, welcher Kategorie die
Schrift angehört. Zum Beispiel skalieren bei serifenlosen Schriften fast
alle kleinen "i" zu dem gleichen Bild.
Die Software vergleicht nicht nur Bild-mit-Font, sondern auch
Font-mit-Font. Wenn ich das "i" von "Unbekannt.ttf" vergleiche mit dem
"i" aus "Arial.ttf", erhalte ich dank der Skalierung Werte über 98%.

Die Routine vergleicht immer nur einen einzelnen Buchstaben. Daher kann
ein "o" nicht mit einer "0" verwechselt werden. Der Trick ist, bei einer
Suche lieber einen Buchstaben wie "Q" zu verwenden, wenn man DIESEN Font
sucht, und lieber ein "l" oder "i" zu nehmen, wenn man grobe Kategorien
sucht.

4.
Man sucht selten nach einem Font, der eine normale Brotschrift zeigt.
Wieso auch - davon hat man etliche. Meistens geht es um eine irgendwie
besondere Schrift, und da hat man durch die Skalierung bessere
Resultate, weil man auch ähnliche Fonts findet. Häufig reicht das.





> >Für jedes dieser Bilder wird ermittelt, wieviele Pixel weiss sind, und
> >wie viele Schwarz, umgerechnet in Prozent. (Naja. Fast. Um der
> >Zweistelligkeit willen rechne ich mit 99 statt 100 als Maximum)
> >
> >Die 64 Werte ergeben dann den Fingerprint: 00 für weiss, 99 für Schwarz,
> >50 für "halb".
> >  
> >
> Die drei Werte  kannst du in 2 bits speichern.
> In Zahlen wär das 0, 1 und 2.
> 00 = weis       = 0
> 01 = schwarz  = 1
> 10 = "halb"      = 2

Wie gesagt: Das wareb Beispiele. Für 0-99 brauche ich 7 Bits

> Um so 64 Werte zu Speichern bräuchtest du 128 bit = 16 Byte
> Das kannst du evtl sogar noch in einer Varibalen in mysql speichern wenn 
> nicht halt in 16 unsigned tinyint und
> da die Werte schön binär Vorliegen würden kann die CPU auch schneller 
> mit umgehn.

Die Repräsentation der Daten ist ja relativ egal, ich denke, das Problem
liegt so, egal, welches Format man jetzt wählt:

Es gibt eine "Liste" mit Werten. Alle diese Werte sind gleich wichtig.
Es gibt keine Funktion in MySQL, die zwei Listen miteinander vergleicht
und die Anzahl/Stärke der Abweichungen zurück gibt.

Alle Formate gehen davon aus, daß es "wichtige" und "weniger wichtigere"
Daten gibt, in denen man dann mit größer, kleiner, gleich den besten
Treffer ermittelt.


> Wo Du schon "Kategorien" sagst: Wie wäre es mit einem Zahlenwert, der
> zwar nicht die Präzision Deines Fingerprints hat, aber eine gewisse
> Vorsortierung erlaubt? So das sich mit einem Statement die X % der
> Fonts gewinnen lassen, bei denen eine Untersuchung mit höher
> Präzission aussichtsreich ist?

Genau das soll der Fingerprint ja sein - eine Vorsortierung, bevor die
Bilder/Fonts richtig verglichen werden, denn das dauert.


> Dazu könnte man ein paar Kriterien erarbeiten, deren Ergebnis sich je
> in einer kleinen Zahl ausdrücken läßt. Was mir einfällt:
> 
> A: Der summierte Schwarzanteil in allen 64 Werten. Mit einem solchen
>    Wert lassen sich dicke Fonts von eher zarten trennen.

Hm, die Idee ist gut. Sehr gut.

Kennt MySQL denn eine Funktion
SELECT * FROM fonts SORT zahl möglichst nahe an 6743653475
?                        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^


> B: Die Wahrscheinlichkeit, dass im Umfeld eines Wertes ein ähnlicher
>    Wert kommt, daß also z.B. neben einem schwarzen Punkt wieder ein
>    schwarzer kommt. Dieser Wert müsste beim serifenlosen Schriften
>    niedriger sein als bei Schriften mit Serifen.

Das Projekt läuft in perl. Bestimmte Dinge verbieten sich einfach, weil
sie zu lahm sind. (A) bekomme ich mit Tricks grafisch raus. Sowas wie
(B) nicht.

Grübel, grübel... tja, da hast du wohl gerade meiner Freundin den
Feiertag versaut. Ich muß heute coden. :-)

Gruß,
Ratti

-- 
 -o) fontlinge | Fontmanagement for Linux | Schriftenverwaltung in Linux
 /\\ http://freshmeat.net/projects/fontlinge/
_\_V http://www.gesindel.de https://sourceforge.net/projects/fontlinge/
signature.asc (application/pgp-signature, 189 B)
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.5 (GNU/Linux)

iD8DBQBBzo1hCGbv12v1ACwRAry/AJ0av2onfTo1LhKQ3yDNbcRb8fnB2wCeNbww
Jllg6ouzkerZeUlC3gRS97A=
=F4su
-----END PGP SIGNATURE-----
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.