Farbverlaufsfunktion

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

 

Krischan

Betreff: Farbverlaufsfunktion

BeitragFr, Nov 21, 2008 19:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe mir eine Funktion geschrieben, die ähnlich funktioniert wie die "Verlaufsumsetzung" in Photoshop (wer das nicht kennt: man bestimmt einfach mit Schiebereglern die Position von Farben und Photoshop berechnet die Verläufe dazwischen vollautomatisch und wendet diesen Farbverlauf auf das aktuelle BIld an).

user posted image

Damit kann man z.B. nachträglich eine Heightmap in eine einfache Colormap mit Höhenfarben für Wasser, Gras und Berge konvertieren aber auch alle sonstigen Farbverläufe zwischen beliebig vielen Farben für verschiedene Zwecke simulieren. Und das geht so:

1. Man definiert einfach die Farben in einem Datafeld in diesem Format:

Data Prozentwert(0-100),Rot,Grün,Blau

2. Aufruf mit

Restore Datenfeld
CreateGradient(Anzahl Farben im Datenfeld,Farbschritte)


Die Funktion berechnet dann automatisch alle Farbsteps zwischen den einzelnen Farben und packt den Gradient in ein Array zur weiteren Verwendung.



Und hier der Code zur allgemeinen Belustigung, er demonstriert vier verschiedene Farbverläufe:
Code: [AUSKLAPPEN]
AppTitle "Photoshop Verlaufsumsetzung Simulation"

Graphics 768,512,32,2

Dim GradientR%(0),GradientG%(0),GradientB%(0),Prozent%(0),Rot%(0),Gruen%(0),Blau%(0)

; Beispiel Planet
Restore Colormap
CreateGradient(9,255)
For i=0 To 255
   Color GradientR(i),GradientG(i),GradientB(i)
   Line 0,i,384,i
Next

; Beispiel Deutschland
Restore Deutschlandfahne
CreateGradient(6,255)
For i=0 To 255
   Color GradientR(i),GradientG(i),GradientB(i)
   Line 0,255+i,384,255+i
Next

; Gegentest: schwarz nach weiss
Restore Graustufen
CreateGradient(2,255)
For i=0 To 255
   Color GradientR(i),GradientG(i),GradientB(i)
   Line 384,i,768,i
Next

; Gegentest: Farbspektrum
Restore Spektrum
CreateGradient(11,255)
For i=0 To 255
   Color GradientR(i),GradientG(i),GradientB(i)
   Line 384,255+i,768,255+i
Next

WaitKey

End

Function CreateGradient(colors%,steps%)
   
   Dim GradientR%(steps),GradientG%(steps),GradientB%(steps),Prozent%(colors),Rot%(colors),Gruen%(colors),Blau%(colors)
   
   Local i%,pos1%,pos2%,pdiff%
   Local rdiff%,gdiff%,bdiff%
   Local rstep#,gstep#,bstep#
   Local counter%=1
   
   ; Farbcodes einlesen
   For i=1 To colors : Read Prozent(i),Rot(i),Gruen(i),Blau(i) : Next
   
   ; Gradient berechnen
   While counter<colors
      
      ; Prozent in Step-Position umrechnen
      pos1%=Prozent(counter)*steps/100
      pos2%=Prozent(counter+1)*steps/100
      
      ; Abstand berechnen
      pdiff%=pos2-pos1
      
      ; Differenz zwischen den Farben berechnen
      rdiff%=Rot(counter)-Rot(counter+1)
      gdiff%=Gruen(counter)-Gruen(counter+1)
      bdiff%=Blau(counter)-Blau(counter+1)
      
      ; Schrittweite zwischen den Farben berechnen
      rstep#=rdiff*1.0/pdiff
      gstep#=gdiff*1.0/pdiff
      bstep#=bdiff*1.0/pdiff
      
      ; Zwischenfarbcodes berechnen
      For i=0 To pdiff
         
         GradientR(pos1+i)=Int(Rot(counter)-(rstep*i))
         GradientG(pos1+i)=Int(Gruen(counter)-(gstep*i))
         GradientB(pos1+i)=Int(Blau(counter)-(bstep*i))
         
      Next
      
      ; Zähler erhöhen
      counter=counter+1
      
   Wend
   
End Function

.Colormap
Data   0,255,255,255   ; weiss:      z.B. Schnee auf Berggipfeln
Data   5,179,179,179   ; grau:         z.B. Fels auf Bergen
Data  15,153,143, 92   ; ocker:      z.B. Tundra
Data  25,115,128, 77   ; hellgrün:      z.B. Steppe
Data  48, 42,102, 41   ; grün:         z.B. Gras
Data  50, 69,108,118   ; hellblau:      z.B. Strand
Data  52, 17, 82,112   ; blau:         z.B. seichtes Meer
Data  75,  9, 62, 92   ; dunkelblau:   z.B. Meer
Data 100,  2, 43, 68   ; tiefblau:      z.B. tiefes Meer

.Deutschlandfahne
Data   0,  0,  0,  0   ; schwarz
Data  32,  0,  0,  0    ; schwarz
Data  33,255,  0,  0   ; rot
Data  65,255,  0,  0   ; rot
Data  66,255,224,  0   ; gold
Data 100,255,224,  0   ; gold

.Graustufen
Data   0,  0,  0,  0   ; schwarz
Data 100,255,255,255   ; weiss

.Spektrum
Data   0,255,  0,  0   ; rot
Data  10,255,128,  0   ; orange
Data  20,255,255,  0   ; gelb
Data  30,128,255,  0   ; gelbgrün
Data  40,  0,255,  0   ; grün
Data  50,  0,255,128   ; grüntürkis
Data  60,  0,255,255   ; türkis
Data  70,  0,128,255   ; hellblau
Data  80,  0,  0,255   ; blau
Data  90,128,  0,255   ; violett-blau
Data 100,255,  0,255   ; violett
 

Krischan

BeitragFr, Apr 10, 2009 9:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe den Code noch einmal erweitert, es ist nun auch möglich, Float-Werte für die Farbposition zu verwenden und den Verlauf zu invertieren, ausserdem können nun mittels Blitzarrays mehrere Verläufe unabhängig voneinander definiert werden:

Code: [AUSKLAPPEN]
AppTitle "Photoshop Verlaufsumsetzung Simulation"

; maximale Anzahl Farben
Const maxcols%=256

Graphics maxcols*2,maxcols*2,32,2

; Farbarrays
Dim Prozent#(0),Rot%(0),Gruen%(0),Blau%(0)

; Blitzarrays
Global PlanetR%[maxcols],PlanetG%[maxcols],PlanetB%[maxcols]
Global GermanR%[maxcols],GermanG%[maxcols],GermanB%[maxcols]
Global GreyscaleR%[maxcols],GreyscaleG%[maxcols],GreyscaleB%[maxcols]
Global SpectrumR%[maxcols],SpectrumG%[maxcols],SpectrumB%[maxcols]

; Beispiel Planet
Restore Colormap
CreateGradient(9,maxcols,False,PlanetR,PlanetG,PlanetB)
For i=0 To maxcols
   Color PlanetR[i],PlanetG[i],PlanetB[i]
   Line 0,i,maxcols,i
Next

; Beispiel Deutschland
Restore Deutschlandfahne
CreateGradient(6,maxcols,False,GermanR,GermanG,GermanB)
For i=0 To maxcols
   Color GermanR[i],GermanG[i],GermanB[i]
   Line 0,maxcols+i,maxcols,maxcols+i
Next

; Gegentest: schwarz nach weiss
Restore Graustufen
CreateGradient(2,maxcols,False,GreyscaleR,GreyscaleG,GreyscaleB)
For i=0 To maxcols
   Color GreyscaleR[i],GreyscaleG[i],GreyscaleB[i]
   Line maxcols,i,maxcols*2,i
Next

; Gegentest: Farbspektrum
Restore Spektrum
CreateGradient(11,maxcols,False,SpectrumR,SpectrumG,SpectrumB)
For i=0 To maxcols
   Color SpectrumR[i],SpectrumG[i],SpectrumB[i]
   Line maxcols,maxcols+i,maxcols*2,maxcols+i
Next

WaitKey

End

Function CreateGradient(colors%,steps%,inverse=False,R%[maxcols],G%[maxcols],B%[maxcols])
   
   Dim Prozent#(colors),Rot%(colors),Gruen%(colors),Blau%(colors)
   
   Local i%,pos1%,pos2%,pdiff%
   Local rdiff%,gdiff%,bdiff%
   Local rstep#,gstep#,bstep#
   Local counter%=0
   
   ; Farbcodes einlesen und ggf. invertieren
   If inverse Then
      For i=colors To 1 Step -1
         Read Prozent(i),Rot(i),Gruen(i),Blau(i)
         Prozent(i)=100.0-Prozent(i)
      Next
   Else
      For i=0 To colors-1 : Read Prozent(i),Rot(i),Gruen(i),Blau(i) : Next
   EndIf
   
    ; Gradient berechnen
   While counter<colors
      
        ; Prozent in Step-Position umrechnen
      pos1=Prozent(counter)*steps*1.0/100
      pos2=Prozent(counter+1)*steps*1.0/100
      
        ; Abstand berechnen
      pdiff=pos2-pos1
      
      
        ; Differenz zwischen den Farben berechnen
      rdiff%=Rot(counter)-Rot(counter+1)
      gdiff%=Gruen(counter)-Gruen(counter+1)
      bdiff%=Blau(counter)-Blau(counter+1)
      
        ; Schrittweite zwischen den Farben berechnen
      rstep#=rdiff*1.0/pdiff
      gstep#=gdiff*1.0/pdiff
      bstep#=bdiff*1.0/pdiff
      
      
        ; Zwischenfarbcodes berechnen
      For i=0 To pdiff
         
         R[pos1+i]=Int(Rot(counter)-(rstep*i))
         G[pos1+i]=Int(Gruen(counter)-(gstep*i))
         B[pos1+i]=Int(Blau(counter)-(bstep*i))
         
      Next
      
        ; Zähler erhöhen
      counter=counter+1
      
   Wend
   
End Function


.Colormap
Data   0.0,255,255,255   ; weiss:      z.B. Schnee auf Berggipfeln
Data   5.0,179,179,179   ; grau:       z.B. Fels auf Bergen
Data  15.0,153,143, 92   ; ocker:      z.B. Tundra
Data  25.0,115,128, 77   ; hellgrün:   z.B. Steppe
Data  48.0, 42,102, 41   ; grün:       z.B. Gras
Data  50.0, 69,108,118   ; hellblau:   z.B. Strand
Data  52.0, 17, 82,112   ; blau:       z.B. seichtes Meer
Data  75.0,  9, 62, 92   ; dunkelblau: z.B. Meer
Data 100.0,  2, 43, 68   ; tiefblau:   z.B. tiefes Meer

.Deutschlandfahne
Data   0.0,  0,  0,  0   ; schwarz
Data  33.0,  0,  0,  0   ; schwarz
Data  33.0,255,  0,  0   ; rot
Data  66.0,255,  0,  0   ; rot
Data  66.0,255,224,  0   ; gold
Data 100.0,255,224,  0   ; gold

.Graustufen
Data   0.0,  0,  0,  0   ; schwarz
Data 100.0,255,255,255   ; weiss

.Spektrum
Data   0.0,255,  0,  0   ; rot
Data  10.0,255,128,  0   ; orange
Data  20.0,255,255,  0   ; gelb
Data  30.0,128,255,  0   ; gelbgrün
Data  40.0,  0,255,  0   ; grün
Data  50.0,  0,255,128   ; grüntürkis
Data  60.0,  0,255,255   ; türkis
Data  70.0,  0,128,255   ; hellblau
Data  80.0,  0,  0,255   ; blau
Data  90.0,128,  0,255   ; violett-blau
Data 100.0,255,  0,255   ; violett
 

aletes

BeitragSa, Apr 25, 2009 9:28
Antworten mit Zitat
Benutzer-Profile anzeigen
sieht ganz schön aus, aber bei der deutschlandflagge brauch man eigentlich keine verlaufsfunktion, kann man ja auch mit 3 ausgefüllten rechtecken machen(mit 'rect'), aber sonst ganz schön gemacht Very Happy
 

Krischan

BeitragSa, Apr 25, 2009 10:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Scherzkeks, das war ja auch nur ein Vergleichstest, ob die harten Übergänge funzen, vor allem im 0.x Prozentbereich.

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group