Création d'une palette de couleurs

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Lord Nelson
Messages : 355
Inscription : dim. 01/déc./2013 15:29

Création d'une palette de couleurs

Message par Lord Nelson »

Salut,

Voici donc ici le code non opérationnel pour crée une palette de couleurs.
Le but est d'avoir toutes les teinte et saturation possible en ayant le plus de couleurs différente possible sans couleurs identique, le problème est que c'est peut être pas possible :?
Mais ont fais au mieux !

C'est un placard, désoler :oops:
Pour vous évité de lancer le programme car il est un peut long, 10 mn environ je dirais
je poste ici l'image du résultat:

Image

Puis le placard de code:

Code : Tout sélectionner

Enumeration 1
  #ImageDepart
  #ImageCreation
EndEnumeration

; Minimum entre 2 Valeurs
Procedure.f Min(Val_1.f, Val_2.f, Val_3.f)
  If Val_1 <= Val_2
    Minimum2.f = Val_1
  Else
    Minimum2.f = Val_2
  EndIf
  If Val_3 <= Minimum2.f
    Minimum2.f = Val_3
  EndIf
  ProcedureReturn Minimum2
EndProcedure

; Maximum entre 2 Valeurs
Procedure.f Max(Val_1.f, Val_2.f, Val_3.f)
  If Val_1 <= Val_2
    Maximum2.f = Val_2
  Else
    Maximum2.f = Val_1
  EndIf
  If Val_3 >= Maximum2.f
    Maximum2.f = Val_3
  EndIf
  ProcedureReturn Maximum2
EndProcedure

; Convertie la couleur en Teinte, Saturation et luminosité
Procedure.s RgbToTSL(Couleur.i, NombreDeDecimale.i = 0)
  
  If NombreDeDecimale.i < 0
    NombreDeDecimale.i = 0
  ElseIf NombreDeDecimale.i > 10
    NombreDeDecimale.i = 10
  EndIf
  
  ; By Dobro d'apres:
  ; http://www.la-photo-en-faits.com/2013/05/RVB-CMJN-TSL-conversion-definition.html et http://www.irem.univ-montp2.fr/optionsciences/20052006/nuanciers.pdf
  
  R = Red(Couleur.i)
  V = Green(Couleur.i)
  B = Blue(Couleur.i)
  
  Maxi = Max(R,V,B)
  Mini = Min(R,V,B)
  
  C = (Maxi - mini)
  
  If Maxi = R
    T.f = 60 * (V - B) / C
  EndIf
  
  If Maxi = V
    T.f = 60 * (2 + (B - R) / C)
  EndIf
  
  If Maxi=B
    T.f = 60 * (4 + (B - R) / C)
  EndIf
  
  S.f = 100 * C / Maxi
  L.f = 100 * Maxi / 255
  
  If T.f <= 0
    T.f = 0
  EndIf
  
  If L.f <= 0
    L.f = 0
  EndIf
  
  If S.f <= 0
    S.f=0
  EndIf
  
  ;   Debug "T.f = " + T.f
  ;   Debug "S.f = " + S.f
  ;   Debug "L.f = " + L.f
  ;   Debug ""
  
  Sortie.s = StrF(T, NombreDeDecimale.i) + "," + StrF(S, NombreDeDecimale.i) + "," + StrF(L, NombreDeDecimale.i) + "," + Str(R) + "," + Str(V) + "," + Str(B)
  ProcedureReturn Sortie.s
  
EndProcedure

; Constrater la couleur, échelle négative pour diminuer et positive pour augmenter.
ProcedureDLL.i Contraste(Couleur.i, Echelle.f)
  Protected Rouge.i, Vert.i, Bleu.i, Alpha.i
  
  Rouge = Couleur & $FF
  Vert = Couleur >> 8 & $FF
  Bleu = Couleur >> 16 & $FF
  Alpha = Couleur >> 24
  Rouge * Echelle + 127 * (1 - Echelle)
  Vert * Echelle + 127 * (1 - Echelle)
  Bleu * Echelle + 127 * (1 - Echelle)
  
  If Rouge > 255 : Rouge = 255
    ElseIf Rouge < 0 : Rouge = 0 : EndIf
  If Vert > 255 : Vert = 255
    ElseIf Vert < 0 : Vert = 0 : EndIf
  If Bleu > 255 : Bleu = 255
    ElseIf Bleu < 0 : Bleu = 0 : EndIf
  
  ProcedureReturn (Rouge | Vert <<8 | Bleu << 16 | Alpha << 24)
EndProcedure

; Création de l'image de la teinte:
;-------------------------------------------------------------------------------------------------------------------------------------------------------

; Le Rouge est à fond soit 255.
Rouge = 255

; Le Vert est au minimum soit 0.
Vert = 0

; Le Bleu est au minimum soit 0.
Bleu = 0

X = 0 ; Position en horizontal sur l'image.

CreateImage(#ImageDepart, 1530, 1, 24, 0) ; Création de l'image.
StartDrawing(ImageOutput(#ImageDepart))

; Tu augmente le Vert de 1 en 1 jusqu'à arriver à 255.
For Vert = 0 To 255
  Couleur = RGB(Rouge, Vert, Bleu) ; Calcule de la couleur en RGB.
  Plot(X, 0, Couleur) ; Ont déssine le point de la couleur sur l'image.
  X + 1 ; Ont avvance d'une position.
Next

; Ont remet le Vert à 255 car il est égale à 256 en sortie de boucle.
Vert = 255

; Tu diminue le Rouge jusqu'à arriver à 0.
; Ont commance à 254 ou sinon il y aura des doublon.
For Rouge = 254 To 0 Step -1
  Couleur = RGB(Rouge, Vert, Bleu) ; Calcule de la couleur en RGB.
  Plot(X, 0, Couleur) ; Ont déssine le point de la couleur sur l'image.
  X + 1 ; Ont avvance d'une position.
Next

; Ont remet le Rouge à 0 car il est égale à -1 en sortie de boucle.
Rouge = 0

; Tu augmente le Bleu de 1 en 1 jusqu'à arriver à 255.
; Ont commance à 1 ou sinon il y aura des doublon.
For Bleu = 1 To 255
  Couleur = RGB(Rouge, Vert, Bleu) ; Calcule de la couleur en RGB.
  Plot(X, 0, Couleur) ; Ont déssine le point de la couleur sur l'image.
  X + 1 ; Ont avvance d'une position.
Next

; Ont remet le Bleu à 255 car il est égale à 256 en sortie de boucle.
Bleu = 255

; Tu diminue le Vert jusqu'à arriver à 0.
; Ont commance à 254 ou sinon il y aura des doublon.
For Vert = 254 To 0 Step -1
  Couleur = RGB(Rouge, Vert, Bleu) ; Calcule de la couleur en RGB.
  Plot(X, 0, Couleur) ; Ont déssine le point de la couleur sur l'image.
  X + 1 ; Ont avvance d'une position.
Next

; Ont remet le Vert à 0 car il est égale à -1 en sortie de boucle.
Vert = 0

; Tu augmente le Rouge  de 1 en 1 jusqu'à arriver à 255.
; Ont commance à 1 ou sinon il y aura des doublon.
For Rouge = 1 To 255
  Couleur = RGB(Rouge, Vert, Bleu) ; Calcule de la couleur en RGB.
  Plot(X, 0, Couleur) ; Ont déssine le point de la couleur sur l'image.
  X + 1 ; Ont avvance d'une position.
Next

; Ont remet le Rouge à 255 car il est égale à 256 en sortie de boucle.
Rouge = 255

; Tu diminue le Bleu jusqu'à arriver à 0.
; Ont commance à 254 et termine à 1 ou sinon il y aura des doublon.
For Bleu = 254 To 1 Step -1
  Couleur = RGB(Rouge, Vert, Bleu) ; Calcule de la couleur en RGB.
  Plot(X, 0, Couleur) ; Ont déssine le point de la couleur sur l'image.
  X + 1 ; Ont avvance d'une position.
Next

; Ont remet le Vert à 0 car il est égale à -1 en sortie de boucle.
Bleu = 0

StopDrawing()
; Fin.

; Fin de création de l'image de la teinte:
;-------------------------------------------------------------------------------------------------------------------------------------------------------


Dim MonTableauDeCouleur.i(1529, 499)
NewList MaListeDeCouleur.i()

X = 0
Y = 0

LargeurImage = ImageWidth(#ImageDepart)
HauteurImage = ImageHeight(#ImageDepart)

StartDrawing(ImageOutput(#ImageDepart))

; Lecture de l'image et mise des couleurs dans un tableau
Repeat
  
  If (X = LargeurImage And Y < HauteurImage)
    X = 0
    Y + 1
  EndIf
  
  Couleur = Point(X, Y)
  MonTableauDeCouleur.i(X, 0) = Couleur
  
  If ((X + 1) = LargeurImage And (Y + 1) = HauteurImage)
    Break
  EndIf
  
  X + 1
  
ForEver

StopDrawing()

; Je vais lire chaque pixel de l'image (Les couleurs sont dans le tableau) et je vais appliquer successivement les saturations en partant du haut vers le bas
; Ainsi la première ligne de l'image aurra le maximum en saturation, la secondes le maximum - 1, etc jusqua 0 (256 en tout)
For TableauX = 0 To 1529
  
  Echelle.f = 1
  ClearList(MaListeDeCouleur.i())
  
  DerniereCouleur.i = -1
  
  Couleur = MonTableauDeCouleur(TableauX, 0)
  
  ; C'est ici que je vais crée toutes les autre saturation de la couleurs dans le tableau
  Repeat
    
    ; Ici je part de la saturation qui est maximum dans l'image et je la diminus
    ; très progréssivement afin d'avoir toutes les saturation de la couleur possible
    Echelle.f - 0.00001
    
    Trouver = 0
    
    ; Recherche de la couleur pour voir si elle n'est aps déjà présente dans la liste
    If DerniereCouleur.i <> Contraste(Couleur, Echelle.f)
      
      ForEach MaListeDeCouleur.i()
        
        If Contraste(Couleur, Echelle.f) = MaListeDeCouleur.i()
          Trouver = 1
          Break
        EndIf
        
      Next
      
    Else
      Trouver = 1
      
    EndIf
    
    If Trouver = 0
      AddElement(MaListeDeCouleur.i())
      MaListeDeCouleur.i() = Contraste(Couleur, Echelle.f)
      ; Enregistrelent de la dernière couleur mise dans la liste
      DerniereCouleur.i = Contraste(Couleur, Echelle.f)
    EndIf
    
    ; Quand l'échel est à 0, sa veux dire que la saturation est à 0, donc on arrete
    If Echelle <= 0
      Break
    EndIf
    
  ForEver
  
  TableauY = 0
  
  Debug TableauX
  
  ; Ici je met les couleurs dans la tableau, je complette toutes les teinte de la couleur dans la tableau en descandant de 1 en 1 jusqua la saturation maximum
  ForEach MaListeDeCouleur.i()
    
    MonTableauDeCouleur.i(TableauX, TableauY) = MaListeDeCouleur.i()
    TableauY + 1
    
  Next
  
Next

; Je crée une image
If CreateImage(#ImageCreation, 1530, 500, 24, 0)
  
  StartDrawing(ImageOutput(#ImageCreation))
  
  ; Je parcour mon tableau pour prendre els couleurs dans l'ordre et ainsi créer l'image
  For Y = 0 To 499
    
    For X = 0 To 1529
      
      Plot(X, Y, MonTableauDeCouleur(X, Y))
      
    Next
    
  Next
  
  StopDrawing()
  SetClipboardImage(#ImageCreation)
  
EndIf
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Création d'une palette de couleurs

Message par Backup »

as tu vu qu'en Purebasic des fonctions toutes faites existent pour faire du dégradé ? :)

Code : Tout sélectionner

If OpenWindow(0, 0, 0, 1024, 768, "GradientColor Exemple", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
	If CreateImage(0, 1024, 768) And StartDrawing(ImageOutput(0))
		Box(0, 0, 1024, 768, $FFFFFF)
		DrawingMode(#PB_2DDrawing_Gradient)   
		BackColor($00000)
		For i=0 To 255 
			GradientColor(0.4, rgb(i,0,0))
			GradientColor(0.8,rgb(0,i,0))
			GradientColor(0.16,rgb(0,0,i))
			GradientColor(0.32,rgb(0,i,i))
			GradientColor(0.64,rgb(i,i,0))
			GradientColor(0.128,rgb(i,0,i))
		Next i
		; -----------------------------------------
		LinearGradient(0, 768, 1024, 768)   
		Box(0, 0, 1024, 768)
		; ------------------------------------
		;CircularGradient(1024/2, 768/2, 768)
		;Circle(1024/2,768/2,768)
		; -----------------------------------------
	StopDrawing() 
	ImageGadget(0, 0, 0, 1024, 768, ImageID(0))
EndIf
Beep(440,100)
Repeat
	Event = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow
EndIf
; EPB
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Re: Création d'une palette de couleurs

Message par GallyHC »

Bonjour,

Un vieux truc a moi qui peu t'être utile : http://purebasic.fr/french/viewtopic.php?f=6&t=12596

Cordialement,
GallyHC
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
poshu
Messages : 1138
Inscription : sam. 31/juil./2004 22:32

Re: Création d'une palette de couleurs

Message par poshu »

Bon, je comprends le concept du commentaire et tout, mais ça devient flippant quand y'a plus de commentaire que de code °_°
Lord Nelson
Messages : 355
Inscription : dim. 01/déc./2013 15:29

Re: Création d'une palette de couleurs

Message par Lord Nelson »

@Dobro, ah tient, c'est vraie ça, j'avais pas pensé, cool merci :)
@GallyHC merci de ton partage 8)
@poshu désoler mais c'est pour bien expliquer se que je voudrait faire et ça permet aussi de mieux m'y retrouver dans mon code :wink:

Sur-ce...
Répondre