Page 1 sur 1

Décomposer une couleur

Publié : ven. 12/août/2011 12:40
par dayvid
Salut

Comment fait-on pour décomposer une couleur comme suit:

Savoir la Teinte d'une couleur
Savoir la saturation d'une couleur
Savoir la luminosité d'une couleur
Savoir la chrominances d'une couleur

Qu'est ce qu'une chrominances ?

Merci d'avence :)

Re: Décomposer une couleur

Publié : ven. 12/août/2011 16:23
par jbernard13
va voir ici http://fr.wikipedia.org/wiki/Couleur

et cherche un peu avec Google .

Re: Décomposer une couleur

Publié : sam. 13/août/2011 10:21
par blendman
sinon, j'avais trouvé des codes permettant de convertir du rgb vers HSV (hue, saturation, value -> teinte, saturation, valeur (luminosité)).

Sur le forum anglais, tu devrais trouver des exemples, et même sur ce forum -ci, je pense, en tapant HSV ou quelque chose comme ça (ou image effect peut être)

Re: Décomposer une couleur

Publié : mar. 16/août/2011 12:43
par dayvid
Oui j'ai déjà été voir sur le Wiki :)

Mais en faite j'ai pas trouvé
j'ai vraiment besoin de savoir

cependent j'ai fait ça qui marche tres bien
j'ai beaucoup chercher et optimiser plusieur fois au max

Code : Tout sélectionner

Global Rouge = 50
Global Vert = 100
Global Bleu = 200

Procedure LePlusGrand()
If Rouge => Vert And Rouge => Bleu
  LePlusGrand = Rouge
  
ElseIf Vert => Rouge And Vert => Bleu
  LePlusGrand = Vert
  
ElseIf Bleu => Rouge And Bleu => Vert
  LePlusGrand = Bleu
  
EndIf

ProcedureReturn LePlusGrand
EndProcedure

Procedure LePlusPetit()
If Rouge <= Vert And Rouge <= Bleu
  LePlusPetit = Rouge
  
ElseIf Vert <= Rouge And Vert <= Bleu
  LePlusPetit = Vert
  
ElseIf Bleu <= Rouge And Bleu <= Vert
  LePlusPetit = Bleu
  
EndIf

ProcedureReturn LePlusPetit
EndProcedure

LePlusGrandNombre.f = LePlusGrand() / 100 * 47.05
LePlusPetitNombre.f = LePlusPetit() / 100 * 47.05

Luminositer = Round(LePlusGrandNombre.f + LePlusPetitNombre.f, #PB_Round_Nearest)

Debug Luminositer
Mais pour le reste comment faire :)

Re: Décomposer une couleur

Publié : ven. 26/août/2011 13:13
par dayvid
Vous pouvez me filer un coup de main please, je suis nul en mat moi :(

Re: Décomposer une couleur

Publié : ven. 26/août/2011 14:13
par falsam
Je vais essayer de répondre à tes définitions bien que je ne sois pas du tout spécialiste. Libres aux autres membres de ce forum d'apporter des observations et de t'aider dans ta demande. :)

je commence par une approche de définition.
dayvid a écrit :Comment fait-on pour décomposer une couleur comme suit:

Savoir la Teinte d'une couleur
Savoir la saturation d'une couleur
Savoir la luminosité d'une couleur
Savoir la chrominances d'une couleur

Qu'est ce qu'une chrominances ?
D'une manière générale une couleur est exprimée en pourcentage de Bleue, de Rouge et de Vert.

Teinte d'une couleur : La teinte est la forme pure d'une couleur, c'est-à-dire sans adjonction, ni de blanc, ni de noir, ni de gris allant généralement de 0 à 255
Tu peux utiliser les commandes Red() Green() et Blue() pour déterminer la teinte d'une couleur dont tu ne connais pas la composition RGB (Red Green Blue)

Exemple : Debug Blue($BFBFB7) aura pour résultat une teinte bleu=191

Saturation d'une couleur :C'est le pourcentage de blanc contenu dans la couleur permetant de rendre un peu plus colorée une photo.

Lorsque tu augmentes la saturation d'une couleur, tu amplifies chaque couleur élémentaire. Un rouge va devenir plus rouge, un vert plus vert et un bleue plus bleue.

Saturer les couleurs d'une image signifie lui donner plus de couleur, plus d'éclat.
Au contraire, désaturer signifie enlever de la couleur ou de l'éclat.
Une couleur totalement désaturée est en niveaux de gris.

La saturation ne fait rien sur une photo noir et blanc par exemple.

Luminosité d'une couleur. Je crois qu'on dit aussi Lumière/Luminance/Clarté. On ajoute une intensité de blanc ou de noir aux teintes.

Chrominance d'une couleur :C'est un ensemble de 3 nombres, chacun représentant la quantité de couleur primaire qu'il faut pour faire apparaître la bonne couleur à l'écran. Ces nombres sont compris généralement entre 0 et 255.

Un signal Rgb(0,0,0) donnera du noir, et un signal Rgb(255,255,255) du blanc.

Re: Décomposer une couleur

Publié : ven. 26/août/2011 14:18
par falsam
Un petit programme simple pour illustrer la décomposition d'une couleur suivant le system RGB.

Code : Tout sélectionner

Enumeration
  #MainForm
  #R
  #RValue
  #G
  #GValue
  #B
  #BValue
  #ColorRGB
  #ColorRGBTemp
  #ImgColor
EndEnumeration

R.l ;Recupération de la couleur Rouge
G.l ;Récupération de la couleur verte
B.l ;Récupération de la coleur Bleu

OpenWindow(#Mainform, 0, 0, 280, 360, "Color")
CreateImage(#ColorRGB, 260, 200)
ImageGadget(#ImgColor, 10, 10, 0, 0, ImageID(#ColorRGB))

;Couleur Rouge (Red)
TextGadget(#PB_Any, 5, 220, 20, 24, "(R)")
TrackBarGadget(#R, 20, 220, 190, 24, 0, 255)
StringGadget(#RValue, 220, 220, 50 , 22, "0", #PB_String_ReadOnly) 

;Couleur Verte (Green)
TextGadget(#PB_Any, 5, 245, 20, 20, "(G)")
TrackBarGadget(#G, 20, 245, 190, 24, 0, 255)
StringGadget(#GValue, 220, 245, 50 , 22, "0", #PB_String_ReadOnly) 

;Couleur Bleu (Blue)
TextGadget(#PB_Any, 5, 270, 20, 20, "(B)")
TrackBarGadget(#B, 20, 270, 190, 24, 0, 255)
StringGadget(#BValue, 220, 270, 50 , 22, "0", #PB_String_ReadOnly) 

Repeat
  Event = WaitWindowEvent()
  Gadget = EventGadget()
  Select Event
    Case #PB_Event_Gadget
      Select Gadget
        Case #R
          SetGadgetText(#RValue, Str(GetGadgetState(#R)))
        Case #G
          SetGadgetText(#GValue, Str(GetGadgetState(#G)))
        Case #B
          SetGadgetText(#BValue, Str(GetGadgetState(#B)))
          
      EndSelect
      
      R=GetGadgetState(#R)
      G=GetGadgetState(#G)
      B=GetGadgetState(#B)
      
      CreateImage(#ColorRGBTemp, 260, 200)
      StartDrawing(ImageOutput(#ColorRGBTemp))
      Box(0, 0, 260, 200, RGB(R, G, B))
      
      StopDrawing()
      SetGadgetState(#ImgColor, ImageID(#ColorRGBTemp))
      FreeImage(#ColorRGBTemp)
                  
    Case #PB_Event_CloseWindow
      End
  EndSelect
ForEver

Re: Décomposer une couleur

Publié : ven. 26/août/2011 14:36
par falsam
Le code illustre la saturation d'une couleur.

Code : Tout sélectionner

Enumeration
  #MainForm
  #R
  #RValue
  #G
  #GValue
  #B
  #BValue
  #ColorRGB
  #ColorRGBTemp
  #ImgColor
  #H
  #HValue
  
EndEnumeration

R.l ;Recupération de la couleur Rouge
G.l ;Récupération de la couleur verte
B.l ;Récupération de la coleur Bleu

;Retourne la Saturation d'une couleur
Procedure RGBToHue(R,G,B)
  Protected Dim ColorRGB(2) 
  Protected var_Min.i ;Min. value of RGB
  Protected var_Max.i ;Max. value of RGB
  Protected del_Max.i ;Delta RGB value
  
  ColorRGB(0)=R
  ColorRGB(1)=G
  ColorRGB(2)=B
  
  SortArray(ColorRGB(), #PB_Sort_Ascending)
  var_Min=ColorRGB(0) ;Min. value of RGB
  var_Max=ColorRGB(2) ;Max. value of RGB
  
  del_Max = (var_Min + var_Max) / 2
  
  If del_Max = 0 Or del_Max = 255
    ProcedureReturn 0
  Else
    If del_Max < 256 / 2
      ProcedureReturn (240 * (del_Max-var_Min) / (del_Max - 0))
    Else
      ProcedureReturn (240 * (var_Max - del_Max) / (256 - del_Max))
    EndIf
  EndIf
EndProcedure


OpenWindow(#Mainform, 0, 0, 280, 360, "Saturation")
CreateImage(#ColorRGB, 260, 200)
ImageGadget(#ImgColor, 10, 10, 0, 0, ImageID(#ColorRGB))

;Couleur Rouge (Red)
TextGadget(#PB_Any, 5, 220, 20, 24, "(R)")
TrackBarGadget(#R, 20, 220, 190, 24, 0, 255)
StringGadget(#RValue, 220, 220, 50 , 22, "0", #PB_String_ReadOnly) 

;Couleur Verte (Green)
TextGadget(#PB_Any, 5, 245, 20, 20, "(G)")
TrackBarGadget(#G, 20, 245, 190, 24, 0, 255)
StringGadget(#GValue, 220, 245, 50 , 22, "0", #PB_String_ReadOnly) 

;Couleur Bleu (Blue)
TextGadget(#PB_Any, 5, 270, 20, 20, "(B)")
TrackBarGadget(#B, 20, 270, 190, 24, 0, 255)
StringGadget(#BValue, 220, 270, 50 , 22, "0", #PB_String_ReadOnly) 

;Saturation
TextGadget(#PB_Any, 5, 295, 20, 20, "(H)")
TrackBarGadget(#H, 20, 295, 190, 24, 0, 240)
DisableGadget(#H, #True)
StringGadget(#HValue, 220, 295, 50 , 22, "0", #PB_String_ReadOnly) 

Repeat
  Event = WaitWindowEvent()
  Gadget = EventGadget()
  Select Event
    Case #PB_Event_Gadget
      Select Gadget
        Case #R
          SetGadgetText(#RValue, Str(GetGadgetState(#R)))
        Case #G
          SetGadgetText(#GValue, Str(GetGadgetState(#G)))
        Case #B
          SetGadgetText(#BValue, Str(GetGadgetState(#B)))
          
      EndSelect
      
      R=GetGadgetState(#R)
      G=GetGadgetState(#G)
      B=GetGadgetState(#B)
      
      CreateImage(#ColorRGBTemp, 260, 200)
      StartDrawing(ImageOutput(#ColorRGBTemp))
      Box(0, 0, 260, 200, RGB(R, G, B))
      
      StopDrawing()
      SetGadgetState(#ImgColor, ImageID(#ColorRGBTemp))
      FreeImage(#ColorRGBTemp)
      
      ;Affichage de la saturation
      SetGadgetText(#HValue, Str(RGBToHue(R,G,B)))
      SetGadgetState(#H, Val(GetGadgetText(#Hvalue)))
      
    Case #PB_Event_CloseWindow
      End
  EndSelect
ForEver


Ouvre une boîte de dialogue standard pour choisir une couleur, puis clique sur le bouton Définir les couleurs personnalisées pour vérifier ce calcul.

Re: Décomposer une couleur

Publié : ven. 26/août/2011 14:56
par dayvid
Merci beaucoup Falsam, je regarde tous sa cher moi :D

Re: Décomposer une couleur

Publié : sam. 27/août/2011 15:55
par dayvid
Voilà un petit programme basic mais il manque la teinte que je ne sais pas calculer, sinon sa marche niquel :)

Code : Tout sélectionner

Global Rouge
Global Vert
Global Bleu

Enumeration
  
  #Fenetre
  
  #BoutonValider
  #BoutonAnnuler
  
  #TrackBarGadgetRouge
  #TrackBarGadgetVert
  #TrackBarGadgetBleu
  
  #ImageCouleurRouge
  #ImageCouleurVert
  #ImageCouleurBleu
  
  #ImageCouleurComposer
  
  #ImageGadgetCouleurComposer
  
  #ImageGadgetCouleurRouge
  #ImageGadgetCouleurVert
  #ImageGadgetCouleurBleu
  
  #TexteNiveauDeRouge
  #TexteNiveauDeVert
  #TexteNiveauDeBleu
  #TexteNiveauTeinte
  #TexteNiveauSaturation
  #TexteNiveauLuminosote
  
EndEnumeration

Procedure LePlusGrand()
  If Rouge => Vert And Rouge => Bleu
    LePlusGrand = Rouge
    
  ElseIf Vert => Rouge And Vert => Bleu
    LePlusGrand = Vert
    
  ElseIf Bleu => Rouge And Bleu => Vert
    LePlusGrand = Bleu
    
  EndIf
  
  ProcedureReturn LePlusGrand
EndProcedure

Procedure LePlusPetit()
  
  If Rouge <= Vert And Rouge <= Bleu
    LePlusPetit = Rouge
    
  ElseIf Vert <= Rouge And Vert <= Bleu
    LePlusPetit = Vert
    
  ElseIf Bleu <= Rouge And Bleu <= Vert
    LePlusPetit = Bleu
    
  EndIf
  
  ProcedureReturn LePlusPetit
EndProcedure

Procedure RGBToHue(Rouge, Vert, Bleu)
  Protected Dim ColorRGB(2) 
  Protected var_Min.i ;Min. value of RGB
  Protected var_Max.i ;Max. value of RGB
  Protected del_Max.f ;Delta RGB value
  
  ColorRGB(0)=Rouge
  ColorRGB(1)=Vert
  ColorRGB(2)=Bleu
  
  SortArray(ColorRGB(), #PB_Sort_Ascending)
  var_Min=ColorRGB(0) ;Min. value of RGB
  var_Max=ColorRGB(2) ;Max. value of RGB
  
  del_Max = (var_Min + var_Max) / 2
  
  If del_Max = 0 Or del_Max = 255
    ProcedureReturn 0
  Else
    If del_Max < 256 / 2
      ProcedureReturn Round((240 * (del_Max-var_Min) / (del_Max - 0)), #PB_Round_Nearest)
    Else
      ProcedureReturn Round((240 * (var_Max - del_Max) / (256 - del_Max)), #PB_Round_Nearest)
    EndIf
  EndIf
EndProcedure

Procedure ChangeCouleur(Couleur)
  
  UseGadgetList(WindowID(#Fenetre))
  CreateImage(#ImageCouleurComposer, 360, 160)
  StartDrawing(ImageOutput(#ImageCouleurComposer))
  Box(0, 0, 360, 280, Couleur)
  StopDrawing()
  
  SetGadgetState(#ImageGadgetCouleurComposer, ImageID(#ImageCouleurComposer))
  
  LePlusGrandNombre.f = LePlusGrand() / 100 * 47.05
  LePlusPetitNombre.f = LePlusPetit() / 100 * 47.05
  
  NiveauLuminosite = Round(LePlusGrandNombre.f + LePlusPetitNombre.f, #PB_Round_Nearest)

  SetGadgetText(#TexteNiveauDeRouge, "Niveau de rouge: " + Str(Rouge))
  SetGadgetText(#TexteNiveauDeVert, "Niveau de vert: " + Str(Vert))
  SetGadgetText(#TexteNiveauDeBleu, "Niveau de bleu: " + Str(Bleu))
  SetGadgetText(#TexteNiveauTeinte, "                Teinte: " + Str(NiveauTeinte))
  SetGadgetText(#TexteNiveauSaturation, "          Saturation: " + Str(RGBToHue(Rouge, Vert, Bleu)))
  SetGadgetText(#TexteNiveauLuminosote, "         Luminosité: " + Str(NiveauLuminosite))
  
EndProcedure

Procedure FenetreCouleur()
  
  If OpenWindow(#Fenetre, 439, 170, 400, 400, "Fenêtre",  #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_TitleBar | #PB_Window_ScreenCentered )
    
    ButtonGadget(#BoutonValider, 122, 360, 75, 25, "Valider")
    ButtonGadget(#BoutonAnnuler, 212, 360, 75, 25, "Annuler")
    
    TextGadget(#TexteNiveauDeRouge, 25, 305, 120, 20, "Niveau de rouge: " + Str(Rouge))
    TextGadget(#TexteNiveauDeVert, 150, 305, 120, 20, "Niveau de vert: " + Str(Vert))
    TextGadget(#TexteNiveauDeBleu, 275, 305, 120, 20, "Niveau de bleu: " + Str(Bleu))
    
    TextGadget(#TexteNiveauTeinte, 25, 325, 120, 20,  "                Teinte: " + Str(NiveauTeinte))
    TextGadget(#TexteNiveauSaturation, 150, 325, 120, 20, "          Saturation: " + Str(NiveauDeSaturation))
    TextGadget(#TexteNiveauLuminosote, 275, 325, 120, 20, "         Luminosité: " + Str(NiveauLuminosite))
    
    CreateImage(#ImageCouleurRouge, 356, 20)
    StartDrawing(ImageOutput(#ImageCouleurRouge))
    Box(0, 0, 360, 20, 0)
    
    X = 1
    
    For R = 0 To 255
      X + 2
      Box(X, 0, 2, 20, RGB(R, 0, 0))
    Next
    
    StopDrawing()
    
    CreateImage(#ImageCouleurVert, 356, 20)
    StartDrawing(ImageOutput(#ImageCouleurVert))
    Box(0, 0, 360, 20, 0)
    
    X = 1
    
    For V = 0 To 255
      X + 2
      Box(X, 0, 2, 20, RGB(0, V, 0))
    Next
    
    StopDrawing()
    
    CreateImage(#ImageCouleurBleu, 356, 20)
    StartDrawing(ImageOutput(#ImageCouleurBleu))
    Box(0, 0, 360, 20, 0)
    
    X = 1
    
    For B = 0 To 255
      X + 2
      Box(X, 0, 2, 20, RGB(0, 0, B))
    Next
    
    StopDrawing()
    
    CreateImage(#ImageCouleurComposer, 360, 160)
    StartDrawing(ImageOutput(#ImageCouleurComposer))
    Box(0, 0, 360, 280, 0)
    StopDrawing()
    
    ImageGadget(#ImageGadgetCouleurComposer, 20, 20, 380, 160, ImageID(#ImageCouleurComposer))
    
    ImageGadget(#ImageGadgetCouleurRouge, 22, 210, 360, 160, ImageID(#ImageCouleurRouge))
    ImageGadget(#ImageGadgetCouleurVert, 22, 240, 360, 160, ImageID(#ImageCouleurVert))
    ImageGadget(#ImageGadgetCouleurBleu, 22, 270, 360, 160, ImageID(#ImageCouleurBleu))
    
    TrackBarGadget(#TrackBarGadgetRouge, 10, 200, 380, 25, 0, 255)
    TrackBarGadget(#TrackBarGadgetVert, 10, 230, 380, 25, 0, 255)
    TrackBarGadget(#TrackBarGadgetBleu, 10, 260, 380, 25, 0, 255)
    
    Repeat ; Start of the event loop
      
      Event = WaitWindowEvent(1) ; This line waits until an event is received from Windows
      WindowID = EventWindow() ; The Window where the event is generated, can be used in the gadget procedures
      GadgetID = EventGadget() ; Is it a gadget event?
      EventType = EventType() ; The event type
      EventMenu = EventMenu() ; The event Menu
      
      If Event = #PB_Event_Gadget
        
        If GadgetID = #TrackBarGadgetRouge
          Rouge = GetGadgetState(#TrackBarGadgetRouge)
          ChangeCouleur(RGB(Rouge, Vert, Bleu))
          
        ElseIf GadgetID = #TrackBarGadgetVert
          Vert = GetGadgetState(#TrackBarGadgetVert)
          ChangeCouleur(RGB(Rouge, Vert, Bleu))
          
          
        ElseIf GadgetID = #TrackBarGadgetBleu
          Bleu = GetGadgetState(#TrackBarGadgetBleu)
          ChangeCouleur(RGB(Rouge, Vert, Bleu))
          
        EndIf
        
      EndIf
      
    Until Event = #PB_Event_CloseWindow ; End of the event loop
    
  EndIf
EndProcedure

FenetreCouleur()

Re: Décomposer une couleur

Publié : sam. 27/août/2011 17:29
par falsam
Bravo Dayvid :)

Quelques remarques: Les bouton Annuler et Valider ne servent à rien dans ton programme.

Tu dis que tu ne sais pas calculé la teinte ? Je vois que tu n'as pas suivi mes explications à moins que je ne sois pas assez clair :p

J'ai dit :
Teinte d'une couleur : La teinte est la forme pure d'une couleur, c'est-à-dire sans adjonction, ni de blanc, ni de noir, ni de gris allant généralement de 0 à 255
Tu peux utiliser les commandes Red() Green() et Blue() pour déterminer la teinte d'une couleur dont tu ne connais pas la composition RGB (Red Green Blue)
Ton programme affiche bien la teinte pour chaque couleur de base (Rouge, Vert, Bleu).

Re: Décomposer une couleur

Publié : sam. 27/août/2011 18:01
par falsam
Deux procédures pour calculer le plus grand et la plus petite des valeurs de 3 couleurs tu charries un peu :)

Tu es faché avec les tri alors que tu as eu la méthode sur d'autres posts.

Le principe consiste à entrer tes nombres dans un tableau et de trier ce tableau.

Déclarer un tableau c'est facile
Dim Montableau(2) pour 3 éléments. (La numération commence à 0)

Trier un tableau est une fonction native de PureBasic
SortArray(Montableau(), #PB_Sort_Ascending)

La valeur la plus petite sera dans Montableau(0)
La valeur la plus grande sera dans Montableau(2)

Tu peux donc remplacer tes procédures LePlusGrand et LePlusPetit par une seule procédure.

Le code çi-dessous reprend les variable que tu as défini dans ton programme.

Code : Tout sélectionner

Global LePlusGrand.l, LePlusPetit.i

Procedure LePlusPetitLePlusGrand(Rouge, Vert, Bleu)
  Protected Dim ColorRGB(2) ;Tableau à trois dimensions
    
  ;On place les trois couleurs dans le tableau
  ColorRGB(0)=Rouge
  ColorRGB(1)=Vert
  ColorRGB(2)=Bleu
  
  ;Tri du tableau
  SortArray(ColorRGB(), #PB_Sort_Ascending)
  
  LePlusPetit=ColorRGB(0)
  LePlusGrand=ColorRGB(2) 
EndProcedure

LePlusPetitLePlusGrand(125, 240, 50)

Debug LePlusGrand
Debug LePlusPetit

Re: Décomposer une couleur

Publié : lun. 29/août/2011 13:18
par dayvid
Bonjour Falsam !
Bravo Dayvid :)
ça me réjoui que cella te plaise :D
Quelques remarques: Les bouton Annuler et Valider ne servent à rien dans ton programme.
Oui éffectivement, un petit oublie :lol:
Tu dis que tu ne sais pas calculé la teinte ? Je vois que tu n'as pas suivi mes explications à moins que je ne sois pas assez clair
Ou alors c'est moi qui est bouché :lol:
Oui éffectivement, j'ai rien compris, je suis désoler :oops:
Pas taper hein :(

Re: Décomposer une couleur

Publié : lun. 29/août/2011 13:52
par falsam
dayvid a écrit :Pas taper hein :(
Ce n'est pas mon genre :)

Re: Décomposer une couleur

Publié : lun. 05/sept./2011 12:31
par dayvid
Veut tu bien m'en dire d'aventage Falsam :)