 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
0oFreako0
Anmeldungsdatum: 17.12.2011 Beiträge: 114
|
Verfasst am: 22.02.2012, 11:43 Titel: Eigene Font benutzen? |
|
|
Hallo ich hab mal eine Frage!
Wie kann ich eine Eigene Font einladen und benutzen?
Und ist es möglich diese Font als Binary Array zu benutzen so das sie Später in der Exe implantiert ist? |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 22.02.2012, 13:14 Titel: |
|
|
Die Einbindung eines eigenen Fonts läuft zunächst einmal über ein BMP.
http://www.freebasic-portal.de/tutorials/schriftarten-unter-freebasic-44-s4.html
Da diese in einen FB-Bildpuffer geladen werden, kann er anschließend natürlich einfach als Binary abgespeichert werden (sollte zumindest, habe ich noch nicht ausprobiert).
Schau dir das Beispiel mal an; wenn Fragen auftauchen, kann ich natürlich gern versuchen weiter zu helfen. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
Sebastian Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
Verfasst am: 22.02.2012, 14:16 Titel: |
|
|
Hallo,
zusätzlich zu nemoreds Empfehlung noch ein weiteres Beispiel:
http://www.freebasic-portal.de/code-beispiele/grafik-und-fonts/zahlen-in-kleiner-schriftgroesse-ausgeben-186.html
Der Code zeigt, wie man eine eigene Raster-Schriftart als Bitmaske(n) innerhalb des Quelltexts unterbringen kann. Das Beispiel ist zwar nur auf Ziffern (0 bis 9) ausgelegt, da es für die Darstellung von Exponenten gedacht ist, doch lässt sich das Prinzip natürlich auch auf den gesamten Zeichensatz übertragen.
Das Integer-Array raw(...) enthält die Bitmasken für alle Ziffern. Jedes Zeichen hat dabei eine bestimmte, feste Größe (a x b Pixel großes Rechteck). Jeder Bildpunkt dieses Rechtecks kann entweder bemalt sein (sichtbarer Punkt) oder nicht (transparent). Diese zwei möglichen Zustände lassen sich ideal über die Binärwerte 0 und 1 abbilden:
Nun kann man sich fragen: Warum aber sind das im Quelltext so seltsame, gar negative, Zahlen? Eigentlich müssten das doch ganz viele Nullen und Einsen sein?!
So könnte man das tatsächlich lösen. Das heißt, man könnte für eine Bitmaske von z.B. 6x8 Pixeln ein Array wie dieses hier erstellen:
Code: | Dim MeinZeichen(0 To 5, 0 To 7) As UByte |
Bei 6x8 Pixeln würde dies einen Speicherverbrauch von 48 Bytes bedeuten. Für jedes Pixel würde also ein ganzes Byte verbraucht. Nun kann man aber mit einem Byte (=8 Bit) ganze 256 verschiedene Zustände darstellen und nicht nur die benötigten 2. Das heißt, wir verschwenden Speicher!
Ein Integer ist in FreeBASIC 32 Bit lang. Das bedeutet, eine einzige Integer-Variable genügt, um 32 Pixel einer Bitmaske zu speichern (entweder Pixel gesetzt oder transparent). Während wir mit dem Byte-Array (s.o.) 48 Bytes für ein einziges Zeichen bräuchten, würden so bereits 2 Integer (insg. bloß 8 Bytes!) reichen, um mehr als ein Zeichen zu speichern. Wir sparen 40 Bytes und haben sogar noch etwas übrig, denn 2 Integer haben zusammen 64 Bit, von denen wir nur 48 bräuchten.
Die seltsamen Werte im Integer-Array im Code-Beispiel sind also nichts anderes als dezimal ausgedrückte Folgen von 0 und 1. Jede dieser Integer-Zahlen codiert ganze 32 Pixel einer (oder mehrerer) Bitmaske(n). Wenn man die Zahlen aus dem Quelltext bspw. in den Windows-Taschenrechner kopiert, sieht man diese Bitfolge (im Modus "Programmierer"):
Viele Grüße!
Sebastian _________________
Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen! |
|
Nach oben |
|
 |
0oFreako0
Anmeldungsdatum: 17.12.2011 Beiträge: 114
|
Verfasst am: 22.02.2012, 16:59 Titel: |
|
|
thx für die schnellen Antworten
Ist es auch möglich Fonts zu integrieren die schon mit Farbe versehen sind?
Wenn man z.B. eine Font hat die ne metallische Texture hat. |
|
Nach oben |
|
 |
St_W

Anmeldungsdatum: 22.07.2007 Beiträge: 957 Wohnort: Austria
|
Verfasst am: 22.02.2012, 17:36 Titel: |
|
|
Sicherlich, wie nemored bereits beschrieben hat. Denn Fonts für FreeBasic im Grafikmodus sind eigentlich nur Bitmaps (=Bilder) - ob du nun für A und B Bilder von Äpfel und Birnen oder eben ein A mit metallic Textur hernimmst bleibt dann allein deine Entscheidung. _________________ Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken) |
|
Nach oben |
|
 |
0oFreako0
Anmeldungsdatum: 17.12.2011 Beiträge: 114
|
Verfasst am: 22.02.2012, 18:57 Titel: |
|
|
Da ich die FBFont.zip vom Beispiel nicht laden kann frag ich mich wie ich mein Font nun Converte.
Dies hier ist meine erstellte Font.
Wie genau aggiere ich jetzt mit dem Code? Also setze das ganze wie in dem Beispiel um? |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 22.02.2012, 23:52 Titel: |
|
|
Wenn alle Zeichen dieselbe Breite haben (ich habe nicht nachgemessen), ist das eigentlich ganz einfach. Du änderst in Voltas Code nur die Zeilen
Code: | myFont[p +1] = CHR("A") 'erstes ASCII-Zeichen
myFont[p +2] = CHR("Z") |
(am besten natürlich gleich mit den entsprechenden Zahlenwerten) und
Code: | For i = 0 To 25 'Für jedes Zeichen wird die
myFont[p +i] = breite 'Pixelbreite eingetragen
Next |
Bei verschiedenen Breiten musst jede einzeln eintragen (könntest du z. B. über DATA-Zeilen lösen).
Wenn du in der Ausgabe die Zeichen nicht so weit auseinander stehen haben willst, musst du sie auch in deinem BMP direkt aneinander setzen. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
0oFreako0
Anmeldungsdatum: 17.12.2011 Beiträge: 114
|
Verfasst am: 23.02.2012, 08:42 Titel: |
|
|
@ nemored
Zitat: |
myFont[p +1] = CHR("A") 'erstes ASCII-Zeichen
myFont[p +2] = CHR("Z")
|
Müsste es nicht eigentlich...
Code: |
myFont[p +1] = Asc("A") 'erstes ASCII-Zeichen
myFont[p +2] = Asc("Z") 'letztes ASCII-Zeichen
|
heissen?
ich hab den Code folgender massen angepasst:
Code: |
Screen 19, 32
Dim As Integer hoch = 34
Dim As Integer breit = 32 * 26
Dim bild_bmp As Any Ptr = ImageCreate( breit, hoch )
Bload( "font.bmp", bild_bmp )
Dim As Ubyte Ptr myFont = ImageCreate( breit, hoch +1)
Dim As Integer p = 32
myFont[p ] = 0
myFont[p +1] = Asc("A")
myFont[p +2] = Asc("Z")
p += 3
For i As Integer = 0 To 25
myFont[p +i] = 32
Next
Put myFont, (0, 1), bild_bmp, (0, 0) - (breit -1, hoch),Trans
ImageDestroy bild_bmp
Draw String (10, 16),"HALLO", , myFont
Sleep
End
|
Das ist das Ergebniss:
Ich denke das der Fehler darin liegt. Das die Reihenfolge der Buchstaben nicht richtig in die Font geschrieben wird. Weil es ja eigentlich 256 Zeichen sind. Müsste ich dann für jeden Buchstaben den Exakten Pointer manuell setzen? |
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 23.02.2012, 10:53 Titel: |
|
|
26 (zeichen) X 32 (pixel) = 832 (pixel) breite
fonta.png = 754 x 34 pixel
Daraus ergibt das es rein rechnerisch schon nicht sein kann das alle Zeichen 32 Pixel breite haben.
Hab die Zeilen bewusst etwas abgeändert, da in der bmp die erste Zeile ohnehin unbenutzt ist...
Dir bleibt entweder die bmp zu ändern das alle Zeichen 32 pixel breit sind, oder aber musst die
breite jedes einzelnen zeichens angeben, per data/array, extra datei oder von hand...
Code: |
Screen 19, 32
Dim As Integer hoch = 34 '+ 1
Dim As Integer breit = 32 * 26
Dim bild_bmp As Any Ptr = ImageCreate( breit, hoch )
Bload( "font.bmp", bild_bmp )
Dim As Ubyte Ptr myFont = cast(ubyte ptr, bild_bmp)
Dim As Integer p = 32
myFont[p ] = 0
myFont[p +1] = Asc("A")
myFont[p +2] = Asc("Z")
p += 3
Dim font_width(0 to 25) as ubyte = {32, 30, 29, 28, 27, 26, 28, 29, 20, 28} '.... weiterführen
For i As Integer = 0 To 25
myFont[p +i] = font_width(i)
Next
Draw String (10, 16),"HALLO", , myFont, trans
Sleep
imagedestroy (bild_bmp)
End
|
_________________
 |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 23.02.2012, 14:32 Titel: |
|
|
0oFreako0 hat Folgendes geschrieben: | Müsste es nicht eigentlich...
Code: |
myFont[p +1] = Asc("A") 'erstes ASCII-Zeichen
myFont[p +2] = Asc("Z") 'letztes ASCII-Zeichen
|
heissen? |
Ja, selbstverständlich. Ist der späten Uhrzeit geschuldet.
Wie Eternal_pain schon geschrieben hat: Der Code geht davon aus, dass das erste angegebene Zeichen ("A") ganz links beginnt und (in deinem Fall) 32 Pixel breit ist. Direkt danach, also ab dem 33. Pixel, wird der Buchstabe "B" vermutet, ab dem 65. Pixel Buchstabe "C" usw. Die Prozedur weiß natürlich nicht, ob du in deinem Bild Lücken hast und wie breit diese Lücken sind. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
0oFreako0
Anmeldungsdatum: 17.12.2011 Beiträge: 114
|
Verfasst am: 24.02.2012, 09:30 Titel: |
|
|
Thx hab das Prinzip jetzt verstanden
Man könnte doch auch eine Funktion basteln die automatisch die Abstände ermittelt oder? Wenn man die Transparente Maskenfarbe einfach per Point abfragt und daraus die Abstände errechnet? |
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 24.02.2012, 10:00 Titel: |
|
|
Eigene 'Fonts' zu nutzen ist zwar ein immer wiederkehrendes Thema,
jedoch sei hier eigentlich gesagt das es ausreicht einmal das Prinzip
zu verstehen.
Es gibt einfach keine Standard-Methode.
Draw String in FreeBASIC ist jedoch für Bildfonts wie hier im fbGFX modus recht gut geeignet.
Das von Sebastian erklärte Bit-Model ist ein weiteres besonders von mir häufig genutztes Format.
Aber ob nun Bild oder Bit Fonts, hat wohl jeder vermutlich seine eigenen Vorlieben
wie diese anzuwenden sind, die möglichkeiten scheinen endlos.
per pointer, pset, get/put, drawstring...
die speicherung der daten temporär per array, data, berechnung und/oder funktion
oder extern als bmp, binär oder sogar komprimiert...
Wie gesagt, wenn Du das Prinzip verstanden hast obliegt es Dir wie Du diese bevorzugt
verwenden möchtest...
Das selbe gilt auch bei der erstellung eines eigenen Fonts.
Viele haben dafür extra einen Editor geschrieben,
ich persönlich nutze der einfachheit meistens BMPs um diese dann
auszulesen. _________________
 |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|