Farbtafel für ColorPicker erstellen

Anfängerfragen zum Programmieren mit PureBasic.
Derren
Beiträge: 558
Registriert: 23.07.2011 02:08

Farbtafel für ColorPicker erstellen

Beitrag von Derren »

Hallo.
Ich versuche gerade einen ColorPicker (Pipette) zu bauen.

Dazu brauch ich natürlich ein Farbfeld, welches ich prozedural erstellen wollte (momentan benutze ich das Bild und eine riesige DataSection, die ich zuvor mittels Point() erstellt haben).
Aber das muss doch eleganter gehen...

So soll das mal aussehen:
Bild

Den Regenboben krieg ich vielleicht noch hin (zumal es ja jetzt Gradientbefehle gibt).
Aber beim Übergang ins Weiße/Schwarze hapert's dann.

Mit einer Farbe (z.B. $0000FF) gibt's einen schönen Übergang, aber mit Mitschfarben kommen breite Streifen in unappetitlichen Farben.

Code: Alles auswählen

Define color.i = $0099FF
Define adjustment.i = $FFFFFF

CreateImage(0, 255, 100)
StartDrawing(ImageOutput(0))

For x = 0 To 255	
	adjustment - $010101
	Line(x, 0, 1, 100,  color & adjustment)	
Next

StopDrawing()

OpenWindow(0, 0, 0, 255, 100, "Gradient nach schwarz", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
ImageGadget(0, 0, 0, 255, 100, ImageID(0))

Repeat
Until WaitWindowEvent()=#PB_Event_CloseWindow 
Weiß jemand wie es richtig geht?

Danke schonmal.

PS: Falls es jemanden interessiert, warum ich das Rad neu erfinde. Ich brauche einen ColorPicker der mit sofort die Farbe ausspuckt. Außerdem brauche ich ein Feld, dass so aussieht, wie oben gezeigt. Es beinhaltet alle Farben, ohne dass man irgendwelche anderen Regler betätigen muss (Helligkeit bei msPaint z.B.).
Geschwindigkeit bei der Auswahl geht hier vor Genauigkeit. (Mit diesem Feld hat man ja nur 65k Farben, aber das ist mehr als Genug für meine Zwecke).
Signatur und so
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Farbtafel für ColorPicker erstellen

Beitrag von STARGÅTE »

So?

Code: Alles auswählen

Enumeration
	#Window
	#Gadget
EndEnumeration


OpenWindow(#Window, 0, 0, 512, 512, "WindowTitle", #PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
	CanvasGadget(#Gadget, 0, 0, WindowWidth(#Window), WindowHeight(#Window))
	
	StartDrawing(CanvasOutput(#Gadget))
		DrawingMode(#PB_2DDrawing_Gradient|#PB_2DDrawing_AlphaBlend)
		; Regenbogen
		LinearGradient(0, 0, OutputWidth(), 0)
		ResetGradientColors()
			GradientColor(0.0/6, $FF0000FF)
			GradientColor(1.0/6, $FF00FFFF)
			GradientColor(2.0/6, $FF00FF00)
			GradientColor(3.0/6, $FFFFFF00)
			GradientColor(4.0/6, $FFFF0000)
			GradientColor(5.0/6, $FFFF00FF)
			GradientColor(6.0/6, $FF0000FF)
		Box(0, 0, OutputWidth(), OutputHeight())
		; Helligkeit
		LinearGradient(0, 0, 0, OutputHeight())
		ResetGradientColors()
			GradientColor(0.000/2, $FFFFFFFF)
			GradientColor(0.999/2, $00FFFFFF)
			GradientColor(1.001/2, $00000000)
			GradientColor(2.000/2, $FF000000)
		Box(0, 0, OutputWidth(), OutputHeight())
	StopDrawing()
	
Repeat
	
	Select WaitWindowEvent()
			
		Case #PB_Event_CloseWindow
			End
			
		Case #PB_Event_Gadget
			Select EventGadget()
			EndSelect
			
	EndSelect
	
ForEver
Über das CanvasGadget kannst du dann auch einfacher auslesen welche Farbe gemeint ist.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Derren
Beiträge: 558
Registriert: 23.07.2011 02:08

Re: Farbtafel für ColorPicker erstellen

Beitrag von Derren »

Oh, Muchas Gracias. :praise:
Hätte mir die Gradientfunktionen genauer anschauen sollen. Ist ja geil, dass die auch Alphatransparenz unterstützen.
Ja, CanvasGadget wollte ich sowieso verwenden.
Signatur und so
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Farbtafel für ColorPicker erstellen

Beitrag von NicTheQuick »

Das sieht aber auch nicht so sauber aus. Sollte man da nicht lieber den HSV-Farbraum nutzen?
Derren
Beiträge: 558
Registriert: 23.07.2011 02:08

Re: Farbtafel für ColorPicker erstellen

Beitrag von Derren »

Ich habe mich durch die verschiedenen Modelle im IDE Farbwähler durchgeklickt.
Kein einziger hat eine Farbtafel in der alle Farben vorhanden sind.

Logisch ist es nicht sauber. Bei der Auflösung kommt man ja auf maximal 65k Farben, also 16bit.
Aber das ist für meine Zwecke egal.

Für mich war wichtig, dass ich jede Farbe direkt anwählen kann, ohne erst einen Helligkeitsregler oder sonstwas zu betätigen um die gewählte Farbe anzupassen.
Signatur und so
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Farbtafel für ColorPicker erstellen

Beitrag von STARGÅTE »

Aber auch diese Farbtafel hat nicht alle Farben.

Die Farbmodelle, die wir in der Computerwelt nutzen, besitzen fast alle 3 Komponenten manchmal sogar 4.
Um also alle möglichen Farben (unabhängig von der Auflösung) auswählen zu könnne, brauchst du mindestens 3 Freiheitsgrade also einen Würfel.

Deswegen hast du bei allen Farbtafeln zu der 2D-Fläche immer noch einen 1D-Schieber für die 3. Komponente.

@NicTheQuick: Vorher umrechnen ist nicht nötig.
Nachdem der Regenbogen gemacht wurde (der ja eh linear interpoliert wird),
wird im unteren Bereich die Dunkelstufe aufgeblendet (Sättigung 100%): Dort gilt: Max(R,B,G)
Das erreiche ich auch durch das Blenden mit Schwarz.
Um oberen Teil wird die Sättigung aufgeblendet (Helligkeit: 100%): Dort gilt 1-Min(R,G,B)/Max(R,G,B)
Das erreiche ich auch, durch das blenden mti Weiß, wird MIN immer größer.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Derren
Beiträge: 558
Registriert: 23.07.2011 02:08

Re: Farbtafel für ColorPicker erstellen

Beitrag von Derren »

Ja. Aber ich will eben keinen Schieber. Ich will ein einziges Control in dem ich alle Farben anwählen kann.
Ich brauche auch nicht "alle" Farben (2^24). Die 2^16 sind mehr als genug. Und ja, ich weiß, dass diese Farbtafel nicht einmal 2^16 Farben hat.

Ich hab die RGB Grund und Mischfarben und von da aus genug Farbstufen zwischen den einzelnen "Grundfarben" (also rot, grün, blau, gelb, magenta, cyan und weiß und schwarz).

Glaubt mir, das reicht völlig aus (für meine Zwecke. Ich versuche ja nicht einen neuen 24 bit Farbraum zu erschaffen).
Die einzige Farbe die fehlt, ist grau. Deswegen gibt es ja diesen kleinen Balken rechts in meinem Originalbild.

Also vielleicht kann ich mit diesem Teil nicht "CF24B1" auswählen, aber "CE26AF" is nahe genug dran. Den Unterschied merkt man eh nur, wenn man eine Referenzfarbe neben dran hat (was z.B. bei Websites der Fall sein kann, aber in meinem Andwendungsgebiet sicher nicht)

Wenn ich euch den ganzen Bildschirm mit FE0000 fülle, dann das Bild für mehrere Sekunden Schwarz mache und dann den Bildschirm mit FD0000 fülle werden die meisten sagen, dass das die gleiche Farbe ist. Und bei Mischfarben fällt der Unterschied noch weniger in's Gewicht.

Also nett, dass ihr euch "Sorgen macht", dass dieses Farbfeld vielleicht ungeeignet ist, aber ich versichere euch, dass es genau das ist, was ich brauche :)
Signatur und so
Antworten