Text Grabben
Übersicht

![]() |
FOODyBetreff: Text Grabben |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hi FOODy,
du wirst zumindest den Trauerrand los wenn du SetBlend ALPHABLEND vor dem Grabben rauswirfst. |
||
![]() |
Bob |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() Gruß, FOODy |
||
BlitzMax + MaxGUI, 64-bit Arch Linux: Intel Core² E8500 | 8 GB Ram | GeForce GTX 460 · 1024 MB |
![]() |
Bob |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() Gruß, FOODy |
||
BlitzMax + MaxGUI, 64-bit Arch Linux: Intel Core² E8500 | 8 GB Ram | GeForce GTX 460 · 1024 MB |
![]() |
Abrexxes |
![]() Antworten mit Zitat ![]() |
---|---|---|
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. ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Verstehe ich nicht so ganz. ![]() 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 ![]() Gruß, FOODy |
||
BlitzMax + MaxGUI, 64-bit Arch Linux: Intel Core² E8500 | 8 GB Ram | GeForce GTX 460 · 1024 MB |
![]() |
Abrexxes |
![]() Antworten mit Zitat ![]() |
---|---|---|
Alle 0 werte sind ein Grafiktemplate. Nur die Werte sind "echte" DrawText commandos. cu |
||
![]() |
FOODy |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ach sowas meinst du ![]() 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 ![]() Oder ich denke diesmal falsch ![]() Gruß, FOODy |
||
BlitzMax + MaxGUI, 64-bit Arch Linux: Intel Core² E8500 | 8 GB Ram | GeForce GTX 460 · 1024 MB |
![]() |
Abrexxes |
![]() Antworten mit Zitat ![]() |
---|---|---|
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. ![]() |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group