Farbverlaufsfunktion
Übersicht

KrischanBetreff: Farbverlaufsfunktion |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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).
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() |
||
Krischan |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Scherzkeks, das war ja auch nur ein Vergleichstest, ob die harten Übergänge funzen, vor allem im 0.x Prozentbereich. | ||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group