Même niveau de Saturation!!!! [RESOLU]

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Fortix
Messages : 559
Inscription : mar. 30/mai/2006 17:03

Même niveau de Saturation!!!! [RESOLU]

Message par Fortix »

Salut,

j'ais un petit problème de raisonnement mathematique :oops: ,concernant la convertion d'une valeur de saturation d'une couleur, par exemple si j'ais une couleur de Saturation 60 je voudrais qu'elle soit égale à 120!! pour celà il faut ajuster les trois couleurs de façon relative à la saturation voulut

voici le code qui permet de relever la valeur d'une couleur quelconque:

Code : Tout sélectionner

Global Max$,Neu$,Min$
Global Max,Neu,Min

ProcedureDLL ConfigRGB2(Color)

    Shared  Max$,Neu$,Min$
    Shared Max,Neu,Min

    R = Red(Color) : G = Green(Color) : B = Blue(Color)
     
    If R < G And R < B 
        Min$="R":Min = R
         
        If G > B 
            Max$="G":Max = G 
            Neu$="B":Neu = B
        Else 
            Max$="B":Max = B
            Neu$="G":Neu = G 
        EndIf
         
    ElseIf G < B 
        Min$="G":Min = G
         
        If R > B 
            Max$="R":Max = R 
            Neu$="B":Neu = B
        Else 
            Max$="B":Max = B
            Neu$="R":Neu = R 
        EndIf 
    Else 
        Min$="B":Min = B
         
        If R > G 
            Max$="R":Max = R
            Neu$="G":Neu = G  
        Else 
            Max$="G":Max = G
            Neu$="R":Neu = R  
        EndIf 
    EndIf
     
EndProcedure

ProcedureDLL Round2(Number.f) 

    x.f = Number-Round(Number,0) 
    
    If x>=0.5 
        ProcedureReturn Round(Number, 1) 
    Else 
        ProcedureReturn Round(Number, 0) 
    EndIf 
    
EndProcedure

ProcedureDLL Saturation(Color)
    
    ConfigRGB2(Color) 

    If Max+Min =< 255 
        vs= Round2((Max-Min)/(Max+Min)*240) 
    Else 
        vs= Round2((Max-Min)/(510-(Max+Min))*240) 
    EndIf
    
    If vs<0:vs=0:EndIf
    If vs>240:vs=240:EndIf
    
    ProcedureReturn vs
    
EndProcedure

et avec la valeur de sortie (qui est la saturation d'une couleur allant de 0 à 240) je voudrais la comparer à 120 (la saturation voulut de la couleur en question!!);

et une fois la comparaison faite il faudra ajuster les valeurs des trois couleurs séparement RGB pour obtenir une saturation de 120 sans pour autant modifier la luminositée de cette dernière :roll: !!!

code pour relever la luminositée (juste pour vérifier!!):

Code : Tout sélectionner

ProcedureDLL Luminance(Color) ; luminosité 

    ConfigRGB2(Color) 
    lumen=Round2(240*(Max + Min)/510)
    
    ProcedureReturn lumen
     
EndProcedure 
jusqu'à maintenant j'ais vraiement tout essayé et ya pas moyen :oops:
j'ais pensé à un "produit en croix" mais le résultats est laborieux!!!

je sais c'est un "casse tête Chinois" n'empêche j'ais vachement besion de votre aide :cry: , merci à vous
Dernière modification par Fortix le dim. 15/mars/2009 19:42, modifié 1 fois.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

qu'appelle tu une saturation ? :) hum :
Dans un espace colorimétrique RVB, la saturation peut être décrite comme l'Écart type σ entre les coordonnées des couleurs R(rouge), V(vert) et B(bleu). Si on choisit μ pour représenter la luminosité, alors
Image
En termes volontairement simplistes, on peut dire qu'une couleur a une saturation maximale si elle à une luminosité de 100% dans le canal rouge, et 0% dans les autres canaux. Cette couleur ne serait pas du tout saturée si tous ses cannaux étaient égaux. Donc on peut dire que la saturation est la différence entre les valeurs des canaux.
Avatar de l’utilisateur
Fortix
Messages : 559
Inscription : mar. 30/mai/2006 17:03

Message par Fortix »

Salut @Dobro :D

tes citations son exactes interessantes même, ce que j'appel saturation c'est la tonalitée (ou densitée) d'une couleur, qui est calculé entre un écart max et min (exemple Max=rouge=130 et Min=bleu=30), plus l'écart est grand et plus la saturation sera élevée et inverse :D

en fait la saturation est de 0 à 240
et une couleur= 3canaux (Rouge,Vert et Bleu) allant chacuns d'eux de 0 à 255 :wink:
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

mince alors !! de 0 a 240 !!??

mon prg de test doit etre pas bon alors !! :lol:

Code : Tout sélectionner

;{- Enumerations / DataSections
;{ Windows
Declare saturation(rouge,vert,bleu) 
Declare dessin_image(saturation)
Enumeration
    #Window_0
EndEnumeration
;}
;{ Gadgets
Enumeration
    #ButtonImage_0
    #TrackBar_Rouge
    #TrackBar_Vert
    #TrackBar_Bleu
    #String_saturation
    #Text_Saturation
    #Text_rouge
    #Text_vert
    #Text_bleu
EndEnumeration
;}
;{ Images
Enumeration
    #Image_ButtonImage_0
    #image
EndEnumeration
;}
;}
Procedure OpenWindow_Window_0()
    If OpenWindow(#Window_0, 446, 53, 305, 249, "Window_0", #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_MinimizeGadget|#PB_Window_TitleBar)
        If CreateGadgetList(WindowID(#Window_0))
            ButtonImageGadget(#ButtonImage_0, 20, 15, 130, 115, ImageID(#image))
            TrackBarGadget(#TrackBar_Rouge, 175, 25, 40, 150, 0, 255, #PB_TrackBar_Ticks|#PB_TrackBar_Vertical)
            TrackBarGadget(#TrackBar_Vert, 215, 25, 40, 150, 0, 255, #PB_TrackBar_Ticks|#PB_TrackBar_Vertical)
            TrackBarGadget(#TrackBar_Bleu, 255, 25, 40, 150, 0, 255, #PB_TrackBar_Ticks|#PB_TrackBar_Vertical)
            StringGadget(#String_saturation, 195, 200, 80, 20, "")
            TextGadget(#Text_Saturation, 100, 200, 110, 20, "Saturation", #PB_Text_Center|#SS_NOPREFIX)
            TextGadget(#Text_rouge, 20, 140, 110, 20, "rouge=", #PB_Text_Center|#SS_NOPREFIX)
            TextGadget(#Text_vert, 20, 160, 110, 20, "vert=", #PB_Text_Center|#SS_NOPREFIX)
            TextGadget(#Text_bleu, 20, 180, 110, 20, "bleu=", #PB_Text_Center|#SS_NOPREFIX) 
        EndIf
    EndIf
EndProcedure

CreateImage(#image,130,115,32)

OpenWindow_Window_0()



;{- Event loop
Repeat
    Select WaitWindowEvent()
            ; ///////////////////
        Case #PB_Event_Gadget
            Select EventGadget()
                Case #ButtonImage_0
                Case #TrackBar_Rouge   
                    rouge=GetGadgetState(#TrackBar_Rouge)
                    SetGadgetText(#Text_rouge,"rouge="+Str(rouge)) 
                    saturation=saturation(rouge,vert,bleu)
                    SetGadgetText(#String_saturation,Str(saturation))
                    
                Case #TrackBar_Vert
                    vert=GetGadgetState(#TrackBar_Vert)
                    SetGadgetText(#Text_vert,"vert="+Str(vert))
                    saturation=saturation(rouge,vert,bleu)
                    SetGadgetText(#String_saturation,Str(saturation))
                    
                Case #TrackBar_Bleu
                    bleu=GetGadgetState(#TrackBar_Bleu)
                    SetGadgetText(#Text_bleu,"bleu="+Str(bleu))
                    saturation=saturation(rouge,vert,bleu)
                    SetGadgetText(#String_saturation,Str(saturation))
                    
                Case #String_saturation 
                    dessin_image(RGB(rouge,vert,bleu))
                Case #Text_Saturation
            EndSelect
            ; ////////////////////////
        Case #PB_Event_CloseWindow
            Select EventWindow()
                Case #Window_0
                    CloseWindow(#Window_0)
                    Break
            EndSelect
    EndSelect
ForEver
;
;}
Procedure saturation(rouge,vert,bleu) 
    saturation=Sqr(Pow((rouge-u),2)+Pow((vert-u),2)+Pow((bleu-u),2))/3 
    ProcedureReturn saturation
EndProcedure




Procedure dessin_image(couleur)
    StartDrawing(ImageOutput(#image))
        Box(0, 0, 130,115, couleur) 
    StopDrawing()
    SetGadgetAttribute(#ButtonImage_0, #PB_Button_Image , ImageID(#image))
    
EndProcedure
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

si j'en crois ce qui est ecrit ici:
http://www.sikkens.com.fr/fr/Couleurs/saturation.htm

la saturation est en fait le pourcentage d'une couleur dans une autre !!

par exemple dans le rose, le pourcentage de rouge est faible, ont dit que cette couleur, n'est pas saturé !!

pour connaitre la saturation de rouge :
il suffirai donc, alors de récupérer le taux de rouge (de 0 à a 255)
mettons 120 pour l'exemple

(100/255)*120 = 47,05 % de saturation de rouge !! ;)

et si tu veux transformer 47,05% en valeur de 0 a 255
il faut faire :
(47.05/100)*255 =119.97 !! :D
Avatar de l’utilisateur
Fortix
Messages : 559
Inscription : mar. 30/mai/2006 17:03

Message par Fortix »

Excellent @Dobro :D ,

je vais de suite convertir ta recherche en PB
Avatar de l’utilisateur
Fortix
Messages : 559
Inscription : mar. 30/mai/2006 17:03

Message par Fortix »

Salut @Dobro

Pour plus de facilitée j'ais fait un code pour tester le filtre "Filtre_SatBAS(Couleur)", c'est sur cette procedure qu'il faut intervenir pour relever la saturation à 120!!:

Code : Tout sélectionner

Global Max$,Neu$,Min$
Global Max,Neu,Min

ProcedureDLL ConfigRGB2(Color)

    Shared  Max$,Neu$,Min$
    Shared Max,Neu,Min

    R = Red(Color) : G = Green(Color) : B = Blue(Color)
     
    If R < G And R < B 
        Min$="R":Min = R
         
        If G > B 
            Max$="G":Max = G 
            Neu$="B":Neu = B
        Else 
            Max$="B":Max = B
            Neu$="G":Neu = G 
        EndIf
         
    ElseIf G < B 
        Min$="G":Min = G
         
        If R > B 
            Max$="R":Max = R 
            Neu$="B":Neu = B
        Else 
            Max$="B":Max = B
            Neu$="R":Neu = R 
        EndIf 
    Else 
        Min$="B":Min = B
         
        If R > G 
            Max$="R":Max = R
            Neu$="G":Neu = G  
        Else 
            Max$="G":Max = G
            Neu$="R":Neu = R  
        EndIf 
    EndIf
     
EndProcedure

ProcedureDLL Round2(Number.f) 

    x.f = Number-Round(Number,0) 
    
    If x>=0.5 
        ProcedureReturn Round(Number, 1) 
    Else 
        ProcedureReturn Round(Number, 0) 
    EndIf 
    
EndProcedure

ProcedureDLL Saturation(Color)
    
    ConfigRGB2(Color) 

    If Max+Min =< 255 
        vs= Round2((Max-Min)/(Max+Min)*240) 
    Else 
        vs= Round2((Max-Min)/(510-(Max+Min))*240) 
    EndIf
    
    If vs<0:vs=0:EndIf
    If vs>240:vs=240:EndIf
    
    ProcedureReturn vs
    
EndProcedure

Procedure Filtre_SatBAS(ColorS)

    R=Red(ColorS):G=Green(ColorS):B=Blue(ColorS)
    
    vst=Saturation(ColorS)
;Sat=vst-120

; If vst=0
;     FU=128
; Else    
;     FT=120*R
;     FU=FT/vst  
; EndIf
; 
; Dsat=Int(Abs(FU-R))
DsatM=(Max-Min)/2  
; Dsat=20    
    
    If vst<120
        ;Sat=Int(Abs(vst-120))          
        
        If vst<>0 
            FT=120*R
            FU=FT/vst 
            Dsat=Int(Abs(FU-R)) 
        Else
            Dsat=0 
        EndIf
        
            If Max$="R"
                If vst<>0 
                    FT=120*R
                    FU=FT/vst 
                    Dsat=Int(Abs(FU-R)) 
                Else
                    Dsat=0 
                EndIf
            ElseIf Max$="G"     
                If vst<>0 
                    FT=120*G
                    FU=FT/vst 
                    Dsat=Int(Abs(FU-G)) 
                Else
                    Dsat=0 
                EndIf
            ElseIf Max$="B"
                If vst<>0 
                    FT=120*B
                    FU=FT/vst 
                    Dsat=Int(Abs(FU-B)) 
                Else
                    Dsat=0 
                EndIf
            EndIf
           
        ;Dsat=32
            If Max$="R"
                r=R+Dsat 
            ElseIf Max$="G"     
                g=G+Dsat
            ElseIf Max$="B"
                b=B+Dsat
            EndIf
            
            If Min$="R"
                r=R-Dsat 
            ElseIf Min$="G"     
                g=G-Dsat
            ElseIf Min$="B"
                b=B-Dsat
            EndIf
 
                            
            If Neu$="R"
                If R < DsatM
                    r=R-Dsat
                Else
                    r=R+Dsat
                EndIf          
            ElseIf Neu$="G"                            
                If G < DsatM
                    g=G-Dsat
                Else
                    g=G+Dsat
                EndIf
            ElseIf Neu$="B"                                
                If B < DsatM
                    b=B-Dsat
                Else
                    b=B+Dsat
                EndIf
            EndIf
            
            If r=0 And g=0 And b=0
                r=30:g=30:b=30
            EndIf
;             
            ProcedureReturn RGB(r,g,b)
    Else
        If r=0 And g=0 And b=0
            ColorS=1973790
        EndIf
        
        ProcedureReturn ColorS
    EndIf
               
EndProcedure

wx=ColorRequester()

wxinisat=Saturation(wx)

recwx=Filtre_SatBAS(wx)

wxrecsat=Saturation(recwx)


Debug "Satini: "+Str(wxinisat)
Debug "Rouge "+Str(Red(wx))
Debug "Vert "+Str(Green(wx))
Debug "Bleu "+Str(Blue(wx))
Debug ""
Debug ""
Debug "Satrec: "+Str(wxrecsat)
Debug "Rouge "+Str(Red(recwx))
Debug "Vert "+Str(Green(recwx))
Debug "Bleu "+Str(Blue(recwx))
:D
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

cool !! :)
Avatar de l’utilisateur
Fortix
Messages : 559
Inscription : mar. 30/mai/2006 17:03

Message par Fortix »

Salut @Dobro :D

Je pense avoir trouvé une solution :lol:

une solution de "perdant" :oops:


mais enfin le résultat est là :D

Code : Tout sélectionner

Procedure Filtre_SatBAS(ColorS)

    R=Red(ColorS):G=Green(ColorS):B=Blue(ColorS)
    
    vst=Saturation(ColorS)
    
    DsatM=(Max-Min)/2
        
        If vst<120 ;And ColorS<>#White Or ColorS<>#Gray
                Repeat
                    Dsat=Dsat+1
                    
                    If Max$="R"
                        r=R+Dsat 
                    ElseIf Max$="G"     
                        g=G+Dsat
                    ElseIf Max$="B"
                        b=B+Dsat
                    EndIf
                    
                    If Min$="R"
                        r=R-Dsat 
                    ElseIf Min$="G"     
                        g=G-Dsat
                    ElseIf Min$="B"
                        b=B-Dsat
                    EndIf

                    If Neu$="R"
                        If R < DsatM
                            r=R-Dsat
                        Else
                            r=R+Dsat
                        EndIf          
                    ElseIf Neu$="G"                            
                        If G < DsatM
                            g=G-Dsat
                        Else
                            g=G+Dsat
                        EndIf
                    ElseIf Neu$="B"                                
                        If B < DsatM
                            b=B-Dsat
                        Else
                            b=B+Dsat
                        EndIf
                    EndIf
                    
                    vstst=Saturation(RGB(r,g,b))
                Until vstst=>120
            
                ProcedureReturn RGB(r,g,b)
        Else
            ProcedureReturn ColorS
        EndIf
               
EndProcedure
ouai je sais c'est null :lol: comme soluce

la formule recherchée me semblais difficile à trouver :oops:

sinon merci à vous tous :D
Répondre