Farbpaletten - Aber wie?

Übersicht Sonstiges Smalltalk

Neue Antwort erstellen

Geeecko

Betreff: Farbpaletten - Aber wie?

BeitragSo, Jul 20, 2008 1:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich stehe gerade vor einem Problem.
Undzwar wie soll ich eine Farbpalette darstellen?
Also sowas wie bei Paint. Sowas:
user posted image
Oder Rund oder so, das ist egal. Hauptsache das alle Farben da sind.
Aber ich weiß gerade nicht, wie ich das anstellen soll.
Kann mir jmd. einen kleinen Denkanstoß geben?^^ Ob BMax BlitzBasic oder sonst was, das ist egal.
Danke.

mfg MD

Nexhmije

BeitragSo, Jul 20, 2008 2:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Wo ist denn da das Problem?

Wie du hoffentlich weißt sind Farben am PC aus 3 Grundfarben aufgebaut. Rot, Grün und Blau, RGB. Die können, im Dezimalsystem jedenfalls, jeweils einen Wert von 0 - 255 haben. 255, 0, 0 wäre also knallrot. 255, 0, 255 wäre Pink und 128, 128, 128 so ein mittel-grau.
Aber das weißt du bestimmt Very Happy ^^

Ich weiß jetzt ich nur nicht, wie deine Frage gemeint war. Wenn du eine Palette angezeigt haben willst, aus der man sich eine Farbe aussuchen kann, dann würde das ja ganz einfach gehen, indem du jede Farbkombination anzeigst und in einem, ich sag' jetzt mal, "dreidimensionalem" Auswahldialog auswählbar machst.

Bei dem Bild das du gepostet hat kann man zum Beispiel (ich hab' mir jetzt nur die ersten paar Zeilen angesehen) sehr schön sehen, wie das gemacht wird. Der erste Wert ist 000000, schwarz (0, 0, 0 in dezimal). Das zweite Feld ist, sagen wir mal 0, 0, 10. Das dritte 0, 0, 20 usw bis 0, 0, 255. Dann geht's weiter, mit z.B 10, 0, 255. Dann wieder 20, 0, 255. Bis man halt alle Kombinationen (naja nicht alle, vll in 10ner-Sprüngen) bis 255, 255, 255 durch hat.

Sorry, ich habe das jetzt vll nicht so verständlich geschrieben, ist ja auch spät. Aber ich hoffe ich konnte dir einen kleinen Denkanstoss geben. Du brauchst halt nur eine Funktion die dir alle Kombinationen liefert und eine, die sie anzeigen tut.

mas93

BeitragSo, Jul 20, 2008 3:45
Antworten mit Zitat
Benutzer-Profile anzeigen
wenn du nur sone farbauswahl machen möchtest, kannst dus dir auch ganz einfach machen.
Du holst dir einfach son Bild von sonem Farbkreis(screenshot) und zeigst es in deinem Prog an.
Dann kannst du ja die Pixelfarbe an der Mausposition abfragen

[url]siehe: https://www.blitzforum.de/help/ReadPixel[/url]

war es das was du wolltest???
Formulier mal deine Frage noch etwas genauer^^
www.lpbase.de
Meine Linkin Park Fanseite[Noch im Aufbau]

Rone

BeitragSo, Jul 20, 2008 6:39
Antworten mit Zitat
Benutzer-Profile anzeigen
moin,
ich hatte gerade langeweile...

Code: [AUSKLAPPEN]


SuperStrict

Type TColor

   Field _r:Int, _g:Int, _b:Int
   
   Method Create:TColor(r:Int, g:Int, b:Int)
      _r = r; _g = g; _b = b
      Return Self
   End Method
   
   Function Fade:TColor(value1:Float, c1:TColor, value2:Float, c2:TColor)
      Return New TColor.Create(c1._r * value1 + c2._r * value2, c1._g * value1 + c2._g * value2, c1._b * value1 + c2._b * value2)
   End Function
   
EndType

 
Graphics 800, 600

Local colorMap:TColor[][] = InitColorMap()


Local black:TColor = New TColor.Create(0, 0, 0) ;
Local white:TColor = New TColor.Create(255, 255, 255) ;
   
Repeat

   Cls
   
   Local cx:Int = MouseX() / 10
   Local cy:Int = MouseY() / 10
   
   If cx > 65 Then
      cx = 65
   ElseIf cx < 0 Then
      cx = 0
   EndIf
   
   If cy > 54 Then
      cy = 54
   ElseIf cy < 0 Then
      cy = 0
   EndIf
   
   For Local ix:Int = 0 Until 66
      For Local iy:Int = 0 Until 55
         SetColor colorMap[ix][iy]._r, colorMap[ix][iy]._g, colorMap[ix][iy]._b
         DrawRect ix * 10, iy * 10, 10, 10
      Next
   Next
   
   
   For Local i:Int = 27 To 0 Step - 1
      Local color:TColor = TColor.Fade(Float(i) / 27.0, colorMap[cx][cy], Float(27 - i) / 27.0, white)
      SetColor color._r, color._g, color._b
      DrawRect 670, 10 * i, 30, 10
   Next
   
   For Local i:Int = 27 To 0 Step - 1
      Local color:TColor = TColor.Fade(Float(i) / 27.0, black, Float(27 - i) / 27.0, colorMap[cx][cy])
      SetColor color._r, color._g, color._b
      DrawRect 670, 280 + 10 * i, 30, 10
   Next
   
   SetColor colorMap[cx][cy]._r, colorMap[cx][cy]._g, colorMap[cx][cy]._b
   DrawRect 10, 560, 30, 30
      
   Flip
   
Until KeyHit(KEY_SPACE)

End

Function InitColorMap:TColor[][] ()

   Local colors:TColor[7]
   colors[0] = New TColor.Create(255, 0, 0)
   colors[1] = New TColor.Create(255, 255, 0)
   colors[2] = New TColor.Create(0, 255, 0)
   colors[3] = New TColor.Create(0, 255, 255)
   colors[4] = New TColor.Create(0, 0, 255)
   colors[5] = New TColor.Create(255, 0, 255)
   colors[6] = New TColor.Create(255, 0, 0)
   
   
   Local grey:TColor = New TColor.Create(127, 127, 127)
   
   Local colorMap:TColor[][]
   colorMap = colorMap[..66]
   For Local i:Int = 0 Until 66
      colorMap[i] = colorMap[i][..56]
   Next
   
   
   For Local i:Int = 0 to 5
      
      For Local f:Int = 10 To 0 Step - 1
   
         Local color:TColor = TColor.Fade(Float(f) / 10.0, colors[i], Float(10 - f) / 10.0, colors[i + 1])
         
         For Local f2:Int = 55 To 0 Step - 1
         
            Local color2:TColor = TColor.Fade(Float(f2) / 55.0, color, Float(55 - f2) / 55.0, grey)
            
            colorMap[i * 11 + (10 - f)][(55 - f2)] = color2
            
         Next
         
      Next
   
   Next
   
   Return colorMap
   
End Function




gute nacht

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSo, Jul 20, 2008 10:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab sowas auch mal gemacht. Hier der Code: [AUSKLAPPEN]
Graphics 384,256,32,2
SetBuffer BackBuffer()

Local R#=0   ;Rot
Local G#=0   ;Grün
Local B#=0   ;Blau
Local X#
Local Y#

LockBuffer BackBuffer()
 For X#=0 To 384
  For Y#=0 To 255
   R=0
   G=0
   B=0

   ;Rotanteil
   If X>256 And X<384 Then R=X-256
   If X>000 And X<128 Then R=128-X

   ;Grünanteil
   If X>000 And X<128 Then G=X
   If X>127 And X<256 Then G=64-(X-192)

   ;Blauanteil
   If X>128 And X<256 Then B=X-128
   If X>255 And X<384 Then B=64-(X-320)

   ;Überschuss abschneiden
   R=R*4:If R>255 Then R=255
   G=G*4:If G>255 Then G=255
   B=B*4:If B>255 Then B=255

   ;Schwarzverlauf
   If Y<128 Then
    R=R*Y/128
    G=G*Y/128
    B=B*Y/128
   End If

   ;Weißverlauf
   If Y>127 Then
    R=256-R:R=256-R*(256-Y)/128:If R>255 Then R=255
    G=256-G:G=256-G*(256-Y)/128:If G>255 Then G=255
    B=256-B:B=256-B*(256-Y)/128:If B>255 Then B=255
   End If

   WritePixel X,Y,Int(R)*65536+Int(G)*256+Int(B)
  Next
 Next
UnlockBuffer BackBuffer()

Flip
FlushKeys
WaitKey
End


Ich hab grad leider kein BlitzMax installiert, dass ich ausprobieren könnte ob die Lösung von Rone eventuell die selbe ist.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

ozzi789

BeitragSo, Jul 20, 2008 10:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Bei B+ mit RequestColor Smile
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5

Geeecko

BeitragSo, Jul 20, 2008 10:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey!
Danke Leute Smile
Jetzt weiß ich wie ichs machen soll. Und genau sowas meinte ich, Rone´s Beispiel funktioniert perfekt.
*Allendiehandschüttel*

lg MD

EDIT:
Habs doch nicht verstanden :-@ Sad ^^
Kann das mal wer mit Text erklären? ODer am besten mit Code und kommentaren Smile

lg MD
  • Zuletzt bearbeitet von Geeecko am So, Jul 20, 2008 15:18, insgesamt einmal bearbeitet

DAK

BeitragSo, Jul 20, 2008 15:10
Antworten mit Zitat
Benutzer-Profile anzeigen
ich würd die blitzsys.dll verwenden, falls du bb/b+/b3d hast... da is der windows-colorpicker und noch einige andere echt coole sachen drin...
Gewinner der 6. und der 68. BlitzCodeCompo

Triton

BeitragSo, Jul 20, 2008 16:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Ist doch relativ einfach. Es gibt 3 Farben Rot, Grün, Blau.

Jede kann werte von 0 bis 255 annehmen, und die zwischenfarben entstehen durch Kombinationen aus
diesen Farben. Es sind also 256³ = 16777216

Um diesen Farbraum darzustellen wäre eben ein Würfel am besten, auf dessen 3 Achsen die Farben
abgetragen werden. Da man aber nicht die 256 Schichten eines solchen Würfels angemessen darstellen kann auf einem
flachen Bildschirm, stellt man eben nur eine da und zusätzlich einen Regler von 0-255 für die 3. Farbe
und schon kann man alle seine Farben darstellen Wink
Coding: silizium-net.de | Portfolio: Triton.ch.vu

ToeB

BeitragSo, Jul 20, 2008 16:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Also praktisch so :

Code: [AUSKLAPPEN]
Graphics 340,255,16,2
SetBuffer BackBuffer()

Global R#,G#,B#,RGB

Repeat
   Cls
   R=0:G=0
   LockBuffer BackBuffer()
   For xx = 1 To 256
      R = R + 1
      G = 0
      For yy = 1 To 256
         G = G + 1
         RGB = 1*$1000000+R*$10000+G*$100+B
         WritePixelFast(xx,yy,RGB,BackBuffer())
      Next
   Next
   UnlockBuffer BackBuffer()
   Text 260,0,"B:"+B
   B = B + MouseZSpeed()
   If B > 255 Then B = 255
   If B < 0 Then B = 0
   Flip
Until KeyHit(1)
End
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!

Willi die Rübe

BeitragSo, Jul 20, 2008 19:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Du kannst auch einfach die richtige Windows Funktion verwenden, habe mal aus Langeweile dir schnell nen kleinen "Wrapper" geschrieben: Download

1. Userlib erstellen:
Code: [AUSKLAPPEN]

;---------------------------
; choosecolor.decls
;---------------------------
.lib "choosecolor.dll"

ChooseColor%():"ChooseColor"
GetColorRed%():"GetColorRed"
GetColorGreen%():"GetColorGreen"
GetColorBlue%():"GetColorBlue"


2. Die Datei in choosecolor.dll umbennen und in dein Projektverzeichnis kopieren.

3. Nun ist alles ganz einfach:
Code: [AUSKLAPPEN]
ChooseColor()
Print GetColorRed()
Print GetColorGreen()
Print GetColorBlue()
WaitKey()


4. Spaß haben Smile

Mfg
Willi

Edit: Neue Version mit GetColor Befehlen
Edit2: Ich mach noch Sachen wie FileRequester und Fontrequester dazu und stell die DLL ins Dll und Userlibs Forum.
Ich habe keine Lösung, aber ich bewundere das Problem.
Tehadon
Q6600, MSI Neo2-FR, 4GB Ram, nVidia 7800 GTX

At the Farewell Party visit: MySpace | Homepage

d-bug

BeitragMo, Jul 21, 2008 7:30
Antworten mit Zitat
Benutzer-Profile anzeigen
BlitzSys.dll hat das schon alles, Willi. Spar dir die Mühe. Very Happy

Geeecko

BeitragMo, Jul 21, 2008 9:03
Antworten mit Zitat
Benutzer-Profile anzeigen
So, jetzt klappts aber echt xD
Danke nochma :]

lg MD

Neue Antwort erstellen


Übersicht Sonstiges Smalltalk

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group