Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Eigene Font benutzen?

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
0oFreako0



Anmeldungsdatum: 17.12.2011
Beiträge: 114

BeitragVerfasst am: 22.02.2012, 11:43    Titel: Eigene Font benutzen? Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4704
Wohnort: ~/

BeitragVerfasst am: 22.02.2012, 13:14    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 22.02.2012, 14:16    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
0oFreako0



Anmeldungsdatum: 17.12.2011
Beiträge: 114

BeitragVerfasst am: 22.02.2012, 16:59    Titel: Antworten mit Zitat

thx für die schnellen Antworten lächeln

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
Benutzer-Profile anzeigen Private Nachricht senden
St_W



Anmeldungsdatum: 22.07.2007
Beiträge: 957
Wohnort: Austria

BeitragVerfasst am: 22.02.2012, 17:36    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
0oFreako0



Anmeldungsdatum: 17.12.2011
Beiträge: 114

BeitragVerfasst am: 22.02.2012, 18:57    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1839
Wohnort: [JN58JR]

BeitragVerfasst am: 22.02.2012, 23:49    Titel: Antworten mit Zitat

Etwas durchknoten, aber sollte helfen: http://ops.ath.cx/code?id=198


MfG
TPM
_________________
[ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4704
Wohnort: ~/

BeitragVerfasst am: 22.02.2012, 23:52    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
0oFreako0



Anmeldungsdatum: 17.12.2011
Beiträge: 114

BeitragVerfasst am: 23.02.2012, 08:42    Titel: Antworten mit Zitat

@ 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
Benutzer-Profile anzeigen Private Nachricht senden
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 23.02.2012, 10:53    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4704
Wohnort: ~/

BeitragVerfasst am: 23.02.2012, 14:32    Titel: Antworten mit Zitat

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

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
Benutzer-Profile anzeigen Private Nachricht senden
0oFreako0



Anmeldungsdatum: 17.12.2011
Beiträge: 114

BeitragVerfasst am: 24.02.2012, 09:30    Titel: Antworten mit Zitat

Thx hab das Prinzip jetzt verstanden lächeln

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
Benutzer-Profile anzeigen Private Nachricht senden
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 24.02.2012, 10:00    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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.

 Impressum :: Datenschutz