Text Grabben

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

FOODy

Betreff: Text Grabben

BeitragFr, Okt 27, 2006 17:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo liebe Community.
Ich quälle mich schon seid einigen Tagen mit einem Problem...
Ein Text möchte ich in einem Image schreiben (mit grabimage).
Der Text wird aber Gesmoothed. (ich hasse das -.-)
Ob mit oder ohne SMOOTHFONT, es kommt immer das gleiche resultat.
Gibt es den keine möglichkeit die Schrift so zu haben wie die unter Windows ist???
Und überhaupt ist das style-argument für den 4r5ch.
Ist bei mir irgendwas kaputt!?
Oder warum sehe ich keinen Unterschied wenn ich den style änder?

Bringt es überhaupt was an Speed wenn man den Text (wenn er die ganze zeit über gezeichnet wird) in ein Image zu speichern?


Hier mal ein kleines Bespiel:
Code: [AUSKLAPPEN]

SuperStrict

Framework BRL.GLMax2D
Import BRL.FreeTypeFont

Graphics 800,600

Local imgImage:TImage = CreateImage(128,32)

SetImageFont(LoadImageFont(getenv_("windir")+"/Fonts/arial.ttf",32))

' Grabben
SetMaskColor 255,0,255
SetBlend ALPHABLEND
SetColor 255,0,255
DrawRect 0,0,128,32
SetColor 0,0,0
DrawText "Testtext",0,0
GrabImage(imgImage,0,0)
Cls
SetMaskColor 0,0,0
' Zeichnen
SetClsColor 255,255,255

Repeat
   Cls
      SetColor 255,255,255
      DrawImage imgImage,MouseX(),MouseY()+32
      SetColor 0,0,0
      DrawText "Testtext",0,0
   Flip
Until AppTerminate() Or KeyDown(KEY_ESCAPE)


Tut mir leid wenn ich etwas unverständlich geschrieben habe, aber irgendwie bin ich müde und wütend zugleich...


Gruß,
FOODy
BlitzMax + MaxGUI, 64-bit Arch Linux: Intel Core² E8500 | 8 GB Ram | GeForce GTX 460 · 1024 MB

Abrexxes

BeitragFr, Okt 27, 2006 19:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Dafür habe ich auch noch keine Lösung gefunden. Schneller ist es auf jeden Fall. Bei einer Text Zeile macht der Unterschied bei mir nichts aus, beides locker unter 1ms Darstellungszeit.

Allerdings sehen andere Fonts ((zb Courier etc besser aus als Arial) aber ohne Pinkschatten) besser aus

Bei 13 Zeilen gehts dann aber los, normal 4-5ms, als Bild1-2. 20 Zeilen 9-12/2-3.


cu

Bob

BeitragSo, Okt 29, 2006 8:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi FOODy,


du wirst zumindest den Trauerrand los wenn du
SetBlend ALPHABLEND vor dem Grabben rauswirfst.

Bob

BeitragSo, Okt 29, 2006 10:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi nocmal,

ich habe nochmal über das Problemm nachgedacht.
Fazit:
Somoothing ist ja nicht anderes als AA.
Eine Technik um Treppenstufen zu verhindern. Dabei wird ja bekantlich an den Kanten des zu zeichnenden Objekts (in dem Fall die Schrift) eine Zwischenfarbe von Objektkant zum Hintergrund verwendet. Wird nun die Hintergrundfarbe mittels Mask ausgeblendet, erscheint an den Kanten natürlich immernoch die Zwischenfarbe.

Also.
Verwende als Maskcolor eine Farbe die FAST der Hintergrundfarbe im späteren Programm entspricht.

Hier dein Code.
(Samt Alphablend)

Code: [AUSKLAPPEN]

SuperStrict

Framework BRL.GLMax2D
Import BRL.FreeTypeFont

Graphics 800,600
AutoMidHandle True
Local imgImage:TImage = CreateImage(128,32)
SetImageFont(LoadImageFont(getenv_("windir")+"/Fonts/arial.ttf",32))

' Grabben
SetBlend alphablend

SetMaskColor 254,254,254
SetColor 254,254,254
DrawRect 0,0,128,32
SetColor 0,0,0
DrawText "Testtext",0,0
GrabImage(imgImage,0,0)

SetClsColor 255,255,255
Repeat
   Cls
      SetColor 255,255,255
      DrawImage imgImage,MouseX(),MouseY()
      SetColor 0,0,0
      DrawText "Testtext",0,0
   Flip
Until AppTerminate() Or KeyDown(KEY_ESCAPE)

FOODy

BeitragSo, Okt 29, 2006 13:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke Bob!
Aber das Problem ist, dass ich nicht "weiß" welchen hintergrund es haben später wird. : /
Es muss doch bestimmt ein Algo geben, mit dem man z.b. die Differenz von Maskcolor und Fontcolor berechnet und als Alphawert einsetzt. (irgendwie so ^^)

Hab schon viel versucht, aber da kommt nur mist raus.
Es muss auch funktionieren wenn die schriftfarbe Rot, Grün, Blau, etc ist....

@Abrexxes:
Ich möcht aber gern Arial Very Happy


Gruß,
FOODy
BlitzMax + MaxGUI, 64-bit Arch Linux: Intel Core² E8500 | 8 GB Ram | GeForce GTX 460 · 1024 MB

Bob

BeitragSo, Okt 29, 2006 17:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

gehe in diesem Fall nicht von der Hintergrundfarbe, sondern von der Fontfarbe aus.
Schwarze Schrift sieht mit grauen AA Pixeln immer gut aus.
Ist der Font z.B. grün, verwendest du halt auch eine güne MaskColor.
Sollte eigentlich klappen.

EDIT:

Nee. Klappt leider doch nicht. Habs grade getestet.
Da musst du wohl vorerst beim Graben auf Alphablend verzichten.
Besser 'ne etwas Pixilige Schift als eine unsaubere Maske.

FOODy

BeitragSo, Okt 29, 2006 18:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Das Problem ist bei mir das ich ebend keine kaputte Schrift haben will : /
Denn wenn ich es mit MASKBLEND mache sieht es so krüppelig aus o_O
(Da das alles was einen Alphawert von <0.5 hat nicht gezeichnet wird)

Ist wohl ein übles Thema mit der Font :S

Gruß,
FOODy
BlitzMax + MaxGUI, 64-bit Arch Linux: Intel Core² E8500 | 8 GB Ram | GeForce GTX 460 · 1024 MB

FOODy

BeitragDo, Nov 02, 2006 17:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab jetzt ein Script geschrieben, der den Text in ein Pixmap "grabt" (Schwarz-Weiß). Die nutze ich dann als Alphamaske.
Dann werden die Pixel durchgegangen und die entsprechende Farbe und der Entsprechende Alphawert wird geschrieben.

Hier wäre der Script:
Code: [AUSKLAPPEN]
SuperStrict
Framework BRL.GLMax2D
Import BRL.FreeTypeFont
Import BRL.StandardIO
Import PUB.Win32


Graphics 640,480

SetImageFont LoadImageFont(getenv_("windir")+"/fonts/tahoma.ttf",32)
Local image:TImage = GetTextImage("Teeeeeeeeeeeest",255,0,0)

SetBlend ALPHABLEND
Repeat
   Cls
      SetColor 255,255,255
      DrawRect 24,24,256,256
      DrawImage image,MouseX(),MouseY()+24
      SetColor 255,0,0
      DrawText "Teeeeeeeeeeeest",32,32
   Flip
Until AppTerminate() Or KeyDown(KEY_ESCAPE)


Function GetTextImage:TImage(text:String,r:Int,g:Int,b:Int)
   Local tmp_color:Int[3];GetColor(tmp_color[0],tmp_color[1],tmp_color[2])
   Local tmp_blend:Int = GetBlend()

   SetBlend ALPHABLEND
   SetColor 255,255,255
   DrawText text,0,0
   Local Pixmap:TPixmap = GrabPixmap(0,0,TextWidth(text),TextHeight(text))
   SetBlend tmp_blend
   SetColor(tmp_color[0],tmp_color[1],tmp_color[2])
   
   Local color:TPixelData = New TPixelData
   For Local x:Int=0 Until Pixmap.width
      For Local y:Int=0 Until Pixmap.height
         color.Read(Pixmap.ReadPixel(x,y))
         Local a:Int = color.i
         Pixmap.WritePixel(x,y,TPixelData.GetARGBColor(a,r,g,b))
      Next
   Next
   Cls

   Return LoadImage(Pixmap)   
   
   Type TPixelData
      Field r:Int
      Field g:Int
      Field b:Int
      Field a:Int
      Field i:Int
      Field argb:Int
      
      Method Read(argb:Int)
         Self.argb = argb
         Self.a = (argb&$FF000000)/$1000000
         Self.r = (argb&$00FF0000)/$10000
         Self.g = (argb&$0000FF00)/$100
         Self.b = (argb&$000000FF)
         Self.i = (r+g+b)/3
      EndMethod
      
      Method GetARGB:Int()
         Return GetARGBColor(a,r,g,b)
      EndMethod
      
      Function GetARGBColor:Int(a:Int,r:Int,g:Int,b:Int)
         Return Int(a*$1000000+r*$10000+g*$100+b)
      EndFunction
   EndType
EndFunction


Vielleicht kann jemand anders noch was damit anfangen.
Danke für eure Hilfe, Abrexxes und Bob Very Happy

Gruß,
FOODy
BlitzMax + MaxGUI, 64-bit Arch Linux: Intel Core² E8500 | 8 GB Ram | GeForce GTX 460 · 1024 MB

Abrexxes

BeitragDi, Nov 07, 2006 13:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,
ich habe auch für mein Problem eine Lösung gefunden. Meine Echtzeittabelle wird als png im benutzen Font geladen. Anschliessend werden nur "echte" Werte in die Tabelle eingetragen nachdem das Bild an der Stelle mit "rect" geschwärzt wurde. So wird das langsame "Drawtext" nur genutzt wenn es auch was einzutragen gibt und das Tempo ist wesentlich schneller. Smile

Nachteile: Auflösungen müssen angepasst werden, wenn alle Werte (312) genutzt werden wirds langsamer. In 95% aller Fälle sind aber nur an die 80 gleichzeitig von Bedeutung.

Der nächste Schritt in meinem Fall. Wäre einen komplett grafischen Font zu benutzen.

cu

FOODy

BeitragDo, Nov 09, 2006 10:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Verstehe ich nicht so ganz. Confused
Ich glaube ich weiß, was du meinst, aber bin mir nicht so sicher.

Kannst du eventuell eine Veranschaulichung posten?

@Grafische Font:
Ja daran hab ich auch schon gedacht.
Aber wie gesagt, nur gedacht Very Happy


Gruß,
FOODy
BlitzMax + MaxGUI, 64-bit Arch Linux: Intel Core² E8500 | 8 GB Ram | GeForce GTX 460 · 1024 MB

Abrexxes

BeitragFr, Nov 10, 2006 17:57
Antworten mit Zitat
Benutzer-Profile anzeigen
user posted image

Alle 0 werte sind ein Grafiktemplate. Nur die Werte sind "echte" DrawText commandos.

cu

FOODy

BeitragFr, Nov 10, 2006 18:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Ach sowas meinst du Very Happy
Dann hab ich es wohl 100%ig falsch verstanden :>
Raffinierte Idee.

Aber die lässt sich meiner Meinung nach auch sehr beschränkt in der Praxis anwenden Question
Oder ich denke diesmal falsch Very Happy


Gruß,
FOODy
BlitzMax + MaxGUI, 64-bit Arch Linux: Intel Core² E8500 | 8 GB Ram | GeForce GTX 460 · 1024 MB

Abrexxes

BeitragSa, Nov 11, 2006 0:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Bisher ist es die schnellste Methode für Echtzeit.(Nichts was ich versuchte war schneller als 2ms). Alles andere dauert zu lang. Natürlich kann der User nicht mehr selbst Fonts bestimmen (Obwohl das rein theoretisch auch noch machbar wäre) aber ohne erweiterte GUI lib ist das eh schwer realisierbar da auch diese ja angepasst werden müsste.

Anders ausgedrückt. Was MAX ohne Gui zustandebringt ist Schrott, da ist jeder Ansatz schneller. Wink

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group