Page 1 sur 1

Convertir la sortie de ColorRequester en RGBA

Publié : jeu. 06/juil./2017 17:11
par Marc56
J'ai pensé naïvement que je pouvais convertir la valeur donnée par le ColorRequester() standard en RGBA comme ceci:

Code : Tout sélectionner

BK_Color_RGB = ColorRequester()
Debug "Couleur RGB =   " + BK_Color_RGB

BK_Color_RGBA.q = RGBA(Red(BK_Color_RGB), Green(BK_Color_RGB), Blue(BK_Color_RGB), 255)
Debug "Couleur RGBA = " + BK_Color_RGBA
Mais cela ne fonctionne pas car la valeur de RGBA va de 0 à 4 294 967 295
et je reçois une valeur négative (même avec un quad)

Note:
- Je n'ai pas besoin de la transparence, donc j'ai mis à 255
- Je préfère utiliser le gadget standard plutôt que d'en faire un

:?:

Re: Convertir la sortie de ColorRequester en RGBA

Publié : jeu. 06/juil./2017 17:52
par Ar-S
En passant par les strings peut être

Code : Tout sélectionner

 BK_Color_RGB = ColorRequester()
Debug "Couleur RGB =   " + BK_Color_RGB

BK_Color_RGBA.s = Str(Red(BK_Color_RGB)) + Str(Green(BK_Color_RGB)) + Str(Blue(BK_Color_RGB)) +"255"
Debug "Couleur RGBA = " + BK_Color_RGBA.s

Debug Val (BK_Color_RGBA.s)

Re: Convertir la sortie de ColorRequester en RGBA

Publié : jeu. 06/juil./2017 19:21
par Zorro
sinon pour info, j'avais fait un Gadget Requester color, qui prends en compte l'Alpha
le curseur vertical permet de choisir le taux de transparence

Code : Tout sélectionner



;***********************************************
;Titre  :*Palette_gadget_alpha
;Auteur  : Zorro
;Date  :06/07/2017
;Heure  :20:29:23
;Version Purebasic :  PureBasic 5.60 (Windows - x86)
;Version de l'editeur :EPB V2.64
; Libairies necessaire : Aucune 
;***********************************************

;***********************************************

;}

Declare.l event_palette_gadget(num) ; a Mettre en Boucle principal  
Declare  Palette_gadget(num,x,y,cadre=0,titre$=""); a Mettre apres Openwindow()
Declare event_palette_gadget_alpha(num,alpha.c)
;{- ***** initialisation du gadget Palette ******************
Structure Pal  ; initialisation du gadget palette
		x.i
		y.i
		largeur.i
		hauteur.i
		Couleur_hex.s ; pour la couleur Hexa
		Couleur.i  ; la couleur
		Rouge.i  ; composante rouge
		Vert.i  ; composante Verte
		Bleu.i  ;composante bleu
		Alpha.c  ; valeur Alpha
		image_cadrillage.i
		image_palette.i
		cadre.b
		titre.s
EndStructure
Global Dim Pal.Pal(10) ; valable pour 10 gadget palettes
Global Fnt=LoadFont (#PB_Any, "Arial", 6)
;} ****************************************************

Enumeration
		#win
EndEnumeration

Enumeration 1 Step 2
		#palette
		#trackbarr1
		#titre
EndEnumeration



If OpenWindow(#win, 0, 0, 350, 300, "Pick_color", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
		
		TextGadget(#titre,1,5,150,20,"Epb Palette")
		; dessin du gadget palette sans cadre avec le trackbarr
		Larg=276 :haut=276
		Palette_gadget(#palette,20,20,0,"")  :TrackBarGadget(#trackbarr1, Larg+25, y, 20, Haut, 0, 255,#PB_TrackBar_Vertical):SetGadgetState(#trackbarr1,255)
		
		Repeat
				Event = WaitWindowEvent(2)
				Select Event
						Case #PB_Event_Gadget
						Select EventGadget() 
								
								Case #palette
								retour=event_palette_gadget(#palette) ; envoi l'event au gadget Palette , qui retourne la couleur choisie dans la Structure
								If retour<>-1
										Debug "couleur Palette 1="+ Pal(#palette)\couleur.i;  affiche la couleur  de la Structure
										Debug "composante Palette 1= "+"Rouge "+Pal(#palette)\rouge.i+" Vert "+Pal(#palette)\vert.i+" Bleu "+Pal(#palette)\bleu.i + "Alpha "+Pal(#palette)\alpha.c ; retourne les composantes de la couleur choisie, present dans la structure
										Debug "retour de la couleur en Hexa :" +Pal(#palette)\Couleur_hex.s 
										Debug " ************************************************************************"
								EndIf
								Case #trackbarr1  ; on touche le trackbarr de la palette 1
								alpha.c=GetGadgetState(#trackbarr1) ; recupere l'alpha du tracbar; et l'envoi a la procedure chargé de faire le boulot
								event_palette_gadget_alpha( #palette,alpha.c)
						EndSelect
				EndSelect
		Until Event = #PB_Event_CloseWindow
EndIf





;-** Zone Procedure ***************

Procedure.l event_palette_gadget(num) ; event_palette_gadget(numero du gadget)
		;By Zorro
		; retourne la couleur choisie
		Static Flag_c ,mem_Flag_c
		Select EventType()
				Case #PB_EventType_MouseEnter, #PB_EventType_MouseMove
				Capture = 1
				x1 = GetGadgetAttribute(num, #PB_Canvas_MouseX)
				y1 = GetGadgetAttribute(num, #PB_Canvas_MouseY)
				
				
				
				If StartDrawing(ImageOutput(pal(num)\image_palette))
						If (x1 >= 0 And x1 <=255)  And (y1 >=0 And y1 <=255)
								Pal(num)\Couleur.i = Point(x1,y1)
						StopDrawing()
						StartDrawing(CanvasOutput(num))
								Box (257,0,20,128,Pal(num)\Couleur.i)
								
								Flag_c=Pal(num)\couleur.i
								If mem_Flag_c<>Flag_c
										;h$=RSet (Hex(Red(Pal(num)\couleur.i)),2,"0") + RSet (Hex(Green(Pal(num)\couleur.i)),2,"0") + RSet (Hex(Blue(Pal(num)\couleur.i)),2,"0")+RSet (Hex(Alpha(Pal(num)\couleur.i)),2,"0")
										h$= Hex(RGBA(Red(Pal(num)\couleur.i),Green(Pal(num)\couleur.i),Blue(Pal(num)\couleur.i),Alpha(Pal(num)\couleur.i) ))
										DrawingFont(FontID(Fnt))      
										DrawText( 160,256, Space(32) )
										DrawText( 160,256, "Hex : "+ h$ )
										DrawText( 160,266, Space(32) )
										DrawText( 160,266, "R : "+Red(Pal(num)\couleur.i)+" V:"+Green(Pal(num)\couleur.i)+" B:"+Blue(Pal(num)\couleur.i)+" A:"+Pal(num)\alpha.c+ "    " )
										
										mem_Flag_c=Flag_c
								EndIf
						EndIf
				StopDrawing()
				;ProcedureReturn
		EndIf
		
		Case  #PB_EventType_LeftClick
		Capture = 0
		;-***** pointage souris ************
		x1 = GetGadgetAttribute(num, #PB_Canvas_MouseX)
		y1 = GetGadgetAttribute(num, #PB_Canvas_MouseY)
		; ********************************
		
		
		If StartDrawing(ImageOutput(pal(num)\image_palette))
				If (x1 >= 0 And x1 <=255)  And (y1 >=0 And y1 <=275)
						Pal(num)\Couleur.i = Point(x1,y1)
				StopDrawing()
				StartDrawing(CanvasOutput(num))
						Box (257,129,20,128,Pal(num)\Couleur.i)
						; met les composantes dans la structure
						Pal(num)\rouge.i=Red(Pal(num)\Couleur.i)
						Pal(num)\vert.i=Green(Pal(num)\Couleur.i)
						Pal(num)\bleu.i=Blue(Pal(num)\Couleur.i)
						
						; //Ajout  Ar-S 21/06/14 - 17h06//
						Pal(num)\Couleur_hex.s = RSet (Hex(Red(Pal(num)\couleur.i)),2,"0") + RSet (Hex(Green(Pal(num)\couleur.i)),2,"0") + RSet (Hex(Blue(Pal(num)\couleur.i)),2,"0")+ RSet (Hex(Alpha(Pal(num)\couleur.i)),2,"0") ; met la couleur Hex dans la structure
				EndIf
		StopDrawing()
		ProcedureReturn 
EndIf
Default
Capture = 0
EndSelect 
ProcedureReturn -1
EndProcedure

Procedure Palette_gadget(num,x,y,cadre=0,titre$="");Palette_gadget(numero du gadget,x,y,largeur,hauteur)
		; By Zorro
		; Affiche le Gadget Palette
		
		Larg=276 :haut=276
		Pal(num)\cadre=cadre
		Pal(num)\titre.s=titre$
		Pal(num)\x=x
		Pal(num)\y=y
		Pal(num)\largeur=Larg
		Pal(num)\hauteur=haut
		Pal(num)\alpha.c=255
		pal(num)\image_cadrillage=CreateImage(#PB_Any,larg,haut,32,$0)
		pal(num)\image_palette=CreateImage(#PB_Any,256,256,32,$0)
		
		If cadre=1
				FrameGadget(#PB_Any, x-25, y-20, Larg+25, Haut+20, titre$)
		EndIf
		
		CanvasGadget(num, x,y,larg,haut)
		
		;;If StartDrawing(CanvasOutput(num)) 
		If StartDrawing(ImageOutput(pal(num)\image_cadrillage)) 
				DrawingMode(#PB_2DDrawing_Default)
				Box(0,0,255,255,RGB(255,255,255))
				For Y=0 To 255-8
						For X=D To 255-8
								Box(X,Y,8,8,$D3D3D3)
								X+(8*2)
						Next
						Y+8
						If D=0
								D=8
						Else
								D=0
						EndIf
				Next y
		StopDrawing()
EndIf

If StartDrawing(ImageOutput(pal(num)\image_palette)) 
		
		DrawingMode(#PB_2DDrawing_Default)
		;{ Palette Graph100
		For y=0 To 255
				For x=0 To 255
						
						abscisse.f=x:Ordonne.f=y: max.f=256: maxY.f=256
						Protected couleur, taux.f, index1.f, index2.f, index3.f, index4.f, index5.f
						
						index1.f = max / 6
						index2.f = 2 * max / 6
						index3.f = 3 * max / 6
						index4.f = 4 * max / 6
						index5.f = 5 * max / 6
						
						If Ordonne * 2 / maxY > 1
								abscisse - index1
								If abscisse < 0 : abscisse + max : EndIf
						EndIf
						
						If abscisse >= 0 And abscisse <= index1
								couleur = RGB(255, (((abscisse * max) / index1) * 255) / max, 0)
						EndIf
						If abscisse > index1 And abscisse <= index2
								couleur = RGB(((max - ((abscisse - index1) * max) / index1) * 255) / max, 255, 0)
						EndIf
						If abscisse > index2 And abscisse <= index3
								couleur = RGB(0, 255, ((((abscisse - index2) * max) / index1) * 255) / max)
						EndIf
						If abscisse > index3 And abscisse <= index4
								couleur = RGB(0, ((max - ((abscisse - index3) * max) / index1) * 255) / max, 255)
						EndIf
						If abscisse > index4 And abscisse <= index5
								couleur = RGB(((abscisse - index4) * 255) / index1, 0, 255)
						EndIf
						If abscisse > index5 And abscisse <= max
								couleur = RGB(255, 0, ((max - ((abscisse - index5) * max) / index1) * 255) / max)
						EndIf
						
						taux.f = Ordonne * 2 / maxY
						If taux <= 1
								couleur = RGB(taux * Red(couleur), taux * Green(couleur), taux * Blue(couleur))
						Else
								taux - 2
								couleur = RGB(255 + taux * Green(couleur), 255 + taux * Blue(couleur), 255 + taux * Red(couleur))
						EndIf
						x1=x+1
						y1=y+1
						If x1>255:x1=255:EndIf
						If y1>255:y1=255:EndIf
						;R=Red(couleur) :V=Green(couleur):B=blue(couleur):A=alpha.c
						;couleur=RGB(R,V,B)
						Plot(x1,y1,couleur)
						
				Next x
		Next y
		xb=0
		Box(xb,256,20,20,RGB(0,0,0))
		xb=xb+20
		Box(xb,256,20,20,RGB(255,255,255))
		xb=xb+20
		Box(xb,256,20,20,RGB(255,0,0))
		xb=xb+20
		Box(xb,256,20,20,RGB(255,255,0))
		xb=xb+20
		Box(xb,256,20,20,RGB(0,255,0))
		xb=xb+20
		Box(xb,256,20,20,RGB(0,255,255))
		xb=xb+20
		Box(xb,256,20,20,RGB(0,0,255))
		xb=xb+20
		Box(xb,256,20,20,RGB(255,0,255))
		
		;}
StopDrawing()
EndIf
; dessin de la palette+cadrillage
event_palette_gadget_alpha(num,255) ; force la transparence a 255 , car lors de la création, il faut pouvoir le voir
;;;
EndProcedure

Procedure event_palette_gadget_alpha(num,alpha.c)
		Pal(num)\alpha.c=alpha.c
		; dessin du cadrillage et de la palette
		If StartDrawing(CanvasOutput(num)) 
				DrawingMode(#PB_2DDrawing_AlphaBlend )
				DrawAlphaImage(ImageID(pal(num)\image_cadrillage),0,0,255);
				DrawAlphaImage(ImageID(pal(num)\image_palette),0,0 ,Pal(num)\alpha.c)
				StopDrawing();>
		EndIf 
EndProcedure
;EPB

:)

Re: Convertir la sortie de ColorRequester en RGBA

Publié : jeu. 06/juil./2017 20:14
par falsam
Marc56 a écrit :et je reçois une valeur négative
Ca me semble normal.

Debug RGBA(255, 0, 0, 255) donnera -16776961
-Choisi la couleur rouge dans le ColorResquestor()
-Si on ajoute le composant alpha = 255 on obtiendra aussi la valeur -16776961

Le code de controle.

Code : Tout sélectionner

;0 - Couleur rouge RGBA
Debug RGBA(255, 0, 0, 255)

;1 - Choisir la couleur rouge dans le color requester
BK_Color_RGB = ColorRequester()
Debug "Couleur RGB =   " + BK_Color_RGB

;2 - Le résultat est le meme qu'au point 0
BK_Color_RGBA = RGBA(Red(BK_Color_RGB), Green(BK_Color_RGB), Blue(BK_Color_RGB), 255)
Debug "Couleur RGBA = " + BK_Color_RGBA

;3 - Décomposition de la couleur rouge RGBA : Le résultat est conforme
Debug "Rouge "+ Red(BK_Color_RGBA)
Debug "Vert " + Green(BK_Color_RGBA)
Debug "Bleu " + Blue(BK_Color_RGBA)
Debug "Transparence " + Alpha(BK_Color_RGBA)
Mais peut être que je dis une bêtise.


■ Une autre méthode pour ajouter le composant de transparence

Code : Tout sélectionner

Alpha = 255
Red_RGB = RGB(255, 0, 0)

Red_RGBA = Red_RGB | Alpha << 24

Debug Red_RGBA

Debug Red(Red_RGBA)
Debug Green(Red_RGBA)
Debug Blue(Red_RGBA)
Debug Alpha(Red_RGBA)
On obtient toujours -16776961 pour le composant rouge + alpha :wink:

Re: Convertir la sortie de ColorRequester en RGBA

Publié : ven. 07/juil./2017 8:26
par Marc56
Yes, Merci falsam, ta solution fonctionne :P
(je l'ai réduite à une ligne pour l'intégrer facilement à mon projet. Je mettrai la transparence à part)

Transformer la sortie du ColorRequester qui est RGB en RGBA (ici opaque, donc valeur 255)

Code : Tout sélectionner

Color_RGBA = ColorRequester() | 255 << 24
'small is beautiful'
:)

(Faudra un jour que j'essaye de comprendre les décalages, maintenant que j'ai (presque) compris les peek et poke) :roll:

Exemple pour montrer la correspondance

Code : Tout sélectionner

; Saisie de couleur RGBA avec le ColorRequester

EnableExplicit

OpenWindow(#PB_Any, 0, 0, 300, 300, "", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

Define Canvas_A = CanvasGadget(#PB_Any, 0,   0, 300, 150)
Define Canvas_B = CanvasGadget(#PB_Any, 0, 150, 300, 150)

; Gadget bitmap couleur RGB (vert pomme)
StartDrawing(CanvasOutput(Canvas_A))
Box(0, 0, 300, 150, RGB(0, 255, 0))
StopDrawing()

; Sélectionnez vert pomme ligne 3 colonne 3
Define Color_RGBA = ColorRequester() | 255 << 24

; Gadget vectoriel donc RGBA
StartVectorDrawing(CanvasVectorOutput(Canvas_B))
VectorSourceColor(Color_RGBA)
FillVectorOutput()
StopVectorDrawing()

While WaitWindowEvent() <> #PB_Event_CloseWindow : Wend
Ici en couleur opaque (sionon remplacer 255 par la valeur alpha)

:wink:

Re: Convertir la sortie de ColorRequester en RGBA

Publié : ven. 07/juil./2017 8:46
par microdevweb
J'avais fais un petit tuto qui peut peut'être t'aider

http://www.purebasic.fr/french/viewtopi ... 21&t=16461

Re: Convertir la sortie de ColorRequester en RGBA

Publié : ven. 07/juil./2017 8:52
par Marc56
microdevweb a écrit :J'avais fais un petit tuto qui peut peut'être t'aider
http://www.purebasic.fr/french/viewtopi ... 21&t=16461
Bonne idée et bon tuto, cela va m'aider.
Je vais me verser un café et étudier cela calmement pendant qu'il fait encore frais et que mes neurones de quinqua sont en forme (le matin seulement, l'après-midi ils bugguent).

Merci microdevweb
:wink:


@falsam: impeccable ta méthode, j'ai pu modifier mon ACME Desk en deux lignes

Code : Tout sélectionner

Case #Mnu_Needle_Clock_BG_Color
     Needle_Clock_BG_Color = ColorRequester(Needle_Clock_BG_Color) | 255 << 24
     
Case #Mnu_Needle_Clock_FG_Color
     Needle_Clock_FG_Color = ColorRequester(Needle_Clock_FG_Color) | 255 << 24
(Je mettrai une petite fenêtre avec un spingadget pour gérer la transparence à part)


:idea: @Fred ou Mesa:

Cette petite astuce utile pourrait peut-être être mise en remarque dans l'aide sur le ColorRequester() ?

Code : Tout sélectionner

Couleur_RGBA = ColorRequester() | Valeur_Transparence << 24
:?:


Merci @tous
:P

Re: Convertir la sortie de ColorRequester en RGBA

Publié : ven. 07/juil./2017 10:17
par Mesa
Bonne idée et en plus pour utiliser SetGadgetColor() il faut du rgb

Code : Tout sélectionner

rgba -> rgb :    rgb =  rgba & $FFFFFF
M.

Re: Convertir la sortie de ColorRequester en RGBA

Publié : ven. 07/juil./2017 14:32
par Tonio
Pas mal du tout Zorro , merci du partage