Farbverlauf über alle Farben...

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

EPS

Betreff: Farbverlauf über alle Farben...

BeitragMi, Dez 29, 2004 20:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi zusammen, ich suche nach einer Funktion die mir ein Bild erzeugen kann in welchem ein Farbverlauf quer durch alle Farben dargestellt wird.

so wie auf diesem Bild hier:

user posted image

Die Routine sollte an eine beliebige Bildgröße anpassbar - also ein wenig variabel - sein.

Ausser auf BlitzBase.de hab ich nirgends eine solche Routine gefunden und mit der genannten komme ich irgendwie nicht klar, sprich ich bekomme es nicht hin das ganze in ein kleineres Bild reinzuwurschteln.

Für Tipps wäre ich echt dankbar. Eine prinipielle Routine die mir erklärt wie man sowas macht würde mir auch schon helfen.

Vielen Dank...EPS

Chester

BeitragMi, Dez 29, 2004 21:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]

for x = 0 to ende
Color r,g,b

line x,0,x,50

if r < 255 and status = 0 then r = r +1
if r= 255 and g < 255 and status = 0 then g = g +1
if g = 255 and b < 255 and status = 0 then b=b+1

if r = 255 and g = 255 and b = 255 then status = 1

if status = 1 then
if r > 0 then r = r -1
if g > 0 and r = 0 then g = g - 1
if b > 0 and g = 0 then  b = b -1
exit
endif
x = x +1
next


Weiß nich obs funtzt is schnell dahin gecodet

EPS

BeitragMi, Dez 29, 2004 21:45
Antworten mit Zitat
Benutzer-Profile anzeigen
nein, tut es nicht

noch jemand anders mit nem Tipp?

Travis

BeitragMi, Dez 29, 2004 21:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Nicht ganz das geforderte Format, aber wenigstens schon mal ein breites Spektrum.

Code: [AUSKLAPPEN]

Graphics 800,600,16,2

For x = 0 To 255
For y = 0 To 255

r = y
g = x
b = 255-y

Color r,g,b
Plot x,y

Next
Next

WaitKey
www.funforge.org

Ich hasse WASD-Steuerung.

Man kann alles sagen, man muss es nur vernünftig begründen können.

EPS

BeitragMi, Dez 29, 2004 22:06
Antworten mit Zitat
Benutzer-Profile anzeigen
hmmm...auch recht hübsch,

ist aber leider nicht ganz das gewünschte sowohl das nicht alle Farben enthalten sind, als auch das es nicht an beliebige Bildgrößen anpassbar ist.

Trotzdem danke

Travis

BeitragMi, Dez 29, 2004 22:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Wirklich alle Farben kannst du sowieso nicht darstellen. Das sind immerhin etwa 16,5 Mio.
www.funforge.org

Ich hasse WASD-Steuerung.

Man kann alles sagen, man muss es nur vernünftig begründen können.

EPS

BeitragMi, Dez 29, 2004 23:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Das ist mir auch klar, aber man kann mittels eines Steps doch irgend wie die Abstände zwischen den Farben errechnen und dann trotzdem solch ein Bild erzeugen.

Es geht halt nur darum das komplette Farbspektrum gleichmäßig in einem Bild abzudecken .

Travis

BeitragDo, Dez 30, 2004 1:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Man müsste sich erstmal überlegen, wie das Beispielbild überhaupt funktioniert. Gehen wir es mal Spaltenweise von oben nach unten durch. Betrachten wir auch erstmal nur die Mitte.

Zuerst haben wir nur Rot(255). Dann wird schrittweise Grün hinzugefügt, bis unsere Farbe schließlich gelb wird. Jetzt wird der Rotanteil schrittweise entfernt, bis nur Grün übrig bleibt. Dann wird der Blauanteil erhöht, bis wir einen Hellblauen Farbton haben. Jetzt wird der Grünanteil entfernt, bis wir ein sattes Blau haben. Anschließend wird der Rotanteil schrittweise erhöht - wir haben jetzt Mangenta. Nun entfernen wir den Blauanteil und es bleibt Rot übrig.

Jetzt müssen wir nur noch die Streifen in den Griff kriegen. Im unteren Bildbereich, können wir ja einfach schrittweise die Intensität der Farbtöne (bei gleichem RGB-Verhältnis) abschwächen. Im oberen Teil müssten wir der Farbe schrittweise die Fehlenden Farbanteile hinzufügen, bis wir einen reinen weisston haben.
www.funforge.org

Ich hasse WASD-Steuerung.

Man kann alles sagen, man muss es nur vernünftig begründen können.

EPS

BeitragDo, Dez 30, 2004 1:14
Antworten mit Zitat
Benutzer-Profile anzeigen
das hast du schön gesagt und nun noch einmal in BlitzBasic Wink

Travis

BeitragDo, Dez 30, 2004 1:19
Antworten mit Zitat
Benutzer-Profile anzeigen
EDIT:

Ich habe es jetzt mal umgesetzt. Allerdings fehlt noch der obere Rand. Und die Formeln für den unteren Rand sind noch nicht ganz korrekt. Außerdem spinnt die Scalierung etwas. Für heute reicht's aber erstmal.

Hoffentlich kommt morgen jemand mit einer 'simpleren' Lösung für die man nicht fast 2000 Byte Code braucht. Ich kann mir einfach keine andere Methode denken als dieses logische stufenweise anpassen der Farbwerte.

Ich werde es dann morgen aber noch etwas optimieren Wink


Die mittlerweile 4. Version:
Code: [AUSKLAPPEN]

; entfernt, weil veraltet
; neue Version siehe weiter unten
www.funforge.org

Ich hasse WASD-Steuerung.

Man kann alles sagen, man muss es nur vernünftig begründen können.
  • Zuletzt bearbeitet von Travis am Do, Dez 30, 2004 15:46, insgesamt einmal bearbeitet

EPS

BeitragDo, Dez 30, 2004 3:34
Antworten mit Zitat
Benutzer-Profile anzeigen
stimmt, ist in der Tat etwas umfangreich Wink

Aber trotzdem vielen Dank für deine Mithilfe...ich hab mich jetzt doch dazu hinreißen lassen mein kleines Köpfchen zum Glühen zu bringen und hab die Funktion selber geschrieben. Das Verfahren basiert auf dem Beispiel von BlitzBase, jedoch ist meine Version mathematisch korrekter und halt an jede Bildgröße anpassbar.

Vielleicht kann es ja mal jemand brauchen...

Code: [AUSKLAPPEN]
Graphics 800,600,32,2

;--> Die exakte größe der Dimension wird in der Funktion eingestellt
Dim col(2,2)

;--> Beispiel

image = CreateImage(630,278)
create_spectrum(image)

ClsColor 80,80,80
SetBuffer BackBuffer()
Cls
DrawBlock image,50,150
Flip
WaitKey()
FreeImage image



Function create_spectrum(img)
;=================================================================
; Diese Funktion erzeugt ein komplettes Farbspektrum in einem Bild
;=================================================================
   w = ImageWidth(img)
   h = ImageHeight(img)
   buffer = ImageBuffer(img)
   Dim col(w,h)
   
   h = h/2
   w6# = w / Float(6)
   col_stepx# = 255 / w6
   col_stepy# = 1 / Float(h)
   
   For x = 0 To w6 - 1
      col(x,0) = 255
      col(x,1) = x * col_stepx
      col(x,2) = 0
      col(x+w6,0) = 255 - x * col_stepx
      col(x+w6,1) = 255
      col(x+w6,2) = 0
      col(x+w6*2,0) = 0
      col(x+w6*2,1) = 255
      col(x+w6*2,2) = x * col_stepx
      col(x+w6*3,0) = 0
      col(x+w6*3,1) = 255 - x * col_stepx
      col(x+w6*3,2) = 255
      col(x+w6*4,0) = x * col_stepx
      col(x+w6*4,1) = 0
      col(x+w6*4,2) = 255
      col(x+w6*5,0) = 255
      col(x+w6*5,1) = 0
      col(x+w6*5,2) = 255 - x * col_stepx
   Next
   
   LockBuffer buffer
   For x = 0 To w
      For y = 0 To h
         r = col(x,0) * y * col_stepy#
         g = col(x,1) * y * col_stepy#
         b = col(x,2) * y * col_stepy#
         rgb = r*$10000 + g*$100 + b
         WritePixelFast x, y, rgb, buffer
         r = 255 - (255 - col(x,0)) / Float(h) * y
         g = 255 - (255 - col(x,1)) / Float(h) * y
         b = 255 - (255 - col(x,2)) / Float(h) * y
         rgb = r*$10000 + g*$100 + b
         WritePixelFast x, 2*h-y, rgb, buffer
      Next
   Next
   UnlockBuffer buffer
End Function

Chester

BeitragDo, Dez 30, 2004 14:09
Antworten mit Zitat
Benutzer-Profile anzeigen
so jetzt funtzt meine Version:

Graphics 800,600,16,1

SetBuffer backbuffer()

For x = 0 to 255*6
Color r,g,b

Line x,y,x,y+10

if r < 255 and status = 0 then r = r +1
if r= 255 and g < 255 and status = 0 then g = g +1
if g = 255 and b < 255 and status = 0 then b=b+1

if r = 255 and g = 255 and b = 255 then status = 1

if status = 1 then
if r > 0 then r = r -1
if g > 0 and r = 0 then g = g - 1
if b > 0 and g = 0 then b = b -1
If r = 0 And g = 0 And b = 0 Then status = 2
EndIf

If status = 2 Then
If r<255 Then r = r + 1
If b<255 Then b = b + 1
If r = 255 And b = 255 Then status = 3 : r=0:g=0:b=0
EndIf

If status = 3 Then
If r<255 Then r=r+1
If g<255 Then g=g+1
If b<255 Then b=b+1
If r=255 And g=255 And b=255 Then exit
EndIf

x = x +0.0000001
If x = 150 Then x = 0 : y = y +11
If KeyHit(1) Then End
Flip
Next


WaitKey()

Travis

BeitragDo, Dez 30, 2004 15:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Jetzt auch meine fertige Version:

Code: [AUSKLAPPEN]

; RGB Farbspektrum
; Copyright (C) Dez 2004, Travis

AppTitle "RGB Spectrum by Travis"
Graphics 800,600,32,2


Const Size# = .5  ; Größe mal 255 Pixel (0.5 = * 2 / 2 = * .5)
Const StepX# = 6*Size ; Step für X-Skalierung (kleiner heisst größer)
Const StepY# = 1*Size ; Step für Y-Skalierung (kleiner heisst größer)

; spectrum
DrawSpectrum()


; main loop
Repeat

 mx = MouseX()
 my = MouseY()

 GetColor mx,my
 r = ColorRed()
 g = ColorGreen()
 b = ColorBlue()

 Color 200,200,200
 Text 560,85, "Press mousebutton to grap"
 Text 610,15, "Selected color"
 Color r,g,b
 Rect 600, 35, 135, 30, 1

 Color gr,gg,gb
 Rect 600, 120, 135, 30, 1

 If MouseHit(1) Then
  Color 0,0,0
  Rect 590, 110, 155, 70, 1
  gr = r
  gg = g
  gb = b
  Color r,g,b
  Text 630, 160, r + " " + g + " " + b
 EndIf

Until KeyHit(1)
End


Function DrawSpectrum()

For ty# = 0 To 255 Step StepY

 y = y + 1 x = 0
 p# = ty/255 ; Y-Zeile in Prozent (Faktor)


 b = 0
 r = 255
 For g = 0 To 255 Step StepX
  x = x + 1

  If p# <= .50 Then
   TempR = r
   TempG = g + ((0.5-p) * (255 - g)*2)
   TempB = b + ((0.5-p) * (255 - b)*2)
   Color Limit(TempR), Limit(TempG), Limit(TempB)
  Else
   TempR = r*(2.0-p*2.0)
   TempG = g*(2.0-p*2.0)
   TempB = b*(2.0-p*2.0)
   Color Limit(TempR), Limit(TempG), Limit(TempB)
  EndIf

  Rect x,y, 1, 1
 Next

 g = 255
 For r = 255 To 0 Step - StepX
  x = x + 1

  If p# <= .50 Then
   TempR = r + ((0.5-p) * (255 - r)*2)
   TempG = g
   TempB = b + ((0.5-p) * (255 - b)*2)
   Color Limit(TempR), Limit(TempG), Limit(TempB)
  Else
   TempR = r*(2.0-p*2.0)
   TempG = g*(2.0-p*2.0)
   TempB = b*(2.0-p*2.0)
   Color Limit(TempR), Limit(TempG), Limit(TempB)
  EndIf

  Rect x,y, 1, 1
 Next

 r = 0
 g = 255
 For b = 0 To 255 Step StepX
  x = x + 1

  If p# <= .50 Then
   TempR = r + ((0.5-p) * (255 - r)*2)
   TempG = g
   TempB = b + ((0.5-p) * (255 - b)*2)
   Color Limit(TempR), Limit(TempG), Limit(TempB)
  Else
   TempR = r*(2.0-p*2.0)
   TempG = g*(2.0-p*2.0)
   TempB = b*(2.0-p*2.0)
   Color Limit(TempR), Limit(TempG), Limit(TempB)
  EndIf

  Rect x,y, 1, 1
 Next

 b = 255
 For g = 255 To 0 Step - StepX
  x = x + 1

  If p# <= .50 Then
   TempR = r + ((0.5-p) * (255 - r)*2)
   TempG = g + ((0.5-p) * (255 - g)*2)
   TempB = b
   Color Limit(TempR), Limit(TempG), Limit(TempB)
  Else
   TempR = r*(2.0-p*2.0)
   TempG = g*(2.0-p*2.0)
   TempB = b*(2.0-p*2.0)
   Color Limit(TempR), Limit(TempG), Limit(TempB)
  EndIf

  Rect x,y, 1, 1
 Next

 g = 0
 b = 255
 For r = 0 To 255 Step StepX
  x = x + 1

  If p# <= .50 Then
   TempR = r + ((0.5-p) * (255 - r)*2)
   TempG = g + ((0.5-p) * (255 - g)*2)
   TempB = b
   Color Limit(TempR), Limit(TempG), Limit(TempB)
  Else
   TempR = r*(2.0-p*2.0)
   TempG = g*(2.0-p*2.0)
   TempB = b*(2.0-p*2.0)
   Color Limit(TempR), Limit(TempG), Limit(TempB)
  EndIf

  Rect x,y, 1, 1
 Next

 r = 255
 For b = 255 To 0 Step - StepX
  x = x + 1

  If p# <= .50 Then
   TempR = r
   TempG = g + ((0.5-p) * (255 - g)*2)
   TempB = b + ((0.5-p) * (255 - b)*2)
   Color Limit(TempR), Limit(TempG), Limit(TempB)
  Else
   TempR = r*(2.0-p*2.0)
   TempG = g*(2.0-p*2.0)
   TempB = b*(2.0-p*2.0)
   Color Limit(TempR), Limit(TempG), Limit(TempB)
  EndIf

  Rect x,y, 1, 1
 Next

Next ; ty

End Function

Function Limit(col)
 If col < -255 Then col = -255
 If col > 255 Then col = 255
 col = Abs(col)
 Return col
End Function
www.funforge.org

Ich hasse WASD-Steuerung.

Man kann alles sagen, man muss es nur vernünftig begründen können.
  • Zuletzt bearbeitet von Travis am Do, Dez 30, 2004 15:38, insgesamt 2-mal bearbeitet

TheShadow

Moderator

BeitragDo, Dez 30, 2004 15:15
Antworten mit Zitat
Benutzer-Profile anzeigen
du musst HSB/HSL nach RGB konvertieren, dann erhälst du do einen Verlauf

H=Farbton 0-359
S=Sättigung
B/L=Helligkeit
AMD64 3500+ | GeForce6600GT 128MB | 1GB DDR | WinXPsp2

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group