Page 1 sur 1
Manipuler la saturation
Publié : sam. 15/déc./2007 23:35
par Fortix
Salutation,
Quelqu'un aurais une procedure qui permet de manipuler la saturation d'une couleur:
par exemple si la valeure de la saturation est < 120 et bien la valeur devient 120, idem si elle est > et qui renvoit la nouvelle couleur
j'ais une procedure qui permet de calculer présisement la valeur de la saturation d'une couleur de 0 à 240
Code : Tout sélectionner
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)
R = Red(Color) : G = Green(Color) : B = Blue(Color)
If R < G And R < B
Min = R
If G > B
Max = G
Else
Max = B
EndIf
ElseIf G < B
Min = G
If R > B
Max = R
Else
Max = B
EndIf
Else
Min = B
If R > G
Max = R
Else
Max = G
EndIf
EndIf
If Max+Min =< 255
ProcedureReturn Round2((Max-Min)/(Max+Min)*240)
Else
ProcedureReturn Round2((Max-Min)/(510-(Max+Min))*240)
EndIf
EndProcedure
qui n'est pas de moi!!!
Merci pour votre aides
Publié : dim. 16/déc./2007 16:16
par Mwoua
Salut
Sur Wikipédia, y'a ce qu'il te faut :
http://fr.wikipedia.org/wiki/Codage_inf ... s_couleurs
Attention à bien gérer les cas spéciaux (R=V=B par exemple).
Publié : lun. 17/déc./2007 11:55
par Fortix
Merci
mais le plus gros du travail serait de l'interpreter en PB

, j'y plonge
Publié : dim. 23/déc./2007 20:57
par Fortix
J'ais donc crée une procedure
"Filtre_01(ValColorS)"qui permet de retirer 50% (donc de 240 on passe à 120)
mais le problème c'est que cse n'est pas du toust précis et le pire c'est qu'il modifit la valeur de la luminositée

,
donc pour ceux qui voudrons me donner un coup de main, j'ais employé une méthode bizard, je pense qu'il s'agit là d'une retouche au pire une vraie procedure qui retir 50% de la saturation d'un pixel sans modifier la lumière
Code : Tout sélectionner
Global Min$,Max$,Neutre$
Global Min,Max
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 Luminance(Color) ; luminosité
R = Red(Color) : G = Green(Color) : B = Blue(Color)
If R < G And R < B
Min = R
If G > B
Max = G
Else
Max = B
EndIf
ElseIf G < B
Min = G
If R > B
Max = R
Else
Max = B
EndIf
Else
Min = B
If R > G
Max = R
Else
Max = G
EndIf
EndIf
ProcedureReturn Round2(240*(Max + Min)/510)
EndProcedure
ProcedureDLL Saturation(Color)
Shared Min$,Max$,Neutre$
Shared Min,Max
R = Red(Color) : G = Green(Color) : B = Blue(Color)
If R < G And R < B
Min = R
Min$="rouge"
If G > B
Max = G
Max$="vert"
Neutre$="bleu"
Else
Max = B
Max$="bleu"
Neutre$="vert"
EndIf
ElseIf G < B
Min = G
Min$="vert"
If R > B
Max = R
Max$="rouge"
Neutre$="bleu"
Else
Max = B
Max$="bleu"
Neutre$="rouge"
EndIf
Else
Min = B
Min$="bleu"
If R > G
Max = R
Max$="rouge"
Neutre$="vert"
Else
Max = G
Max$="vert"
Neutre$="rouge"
EndIf
EndIf
If Max+Min =< 255
ProcedureReturn Round2((Max-Min)/(Max+Min)*240)
Else
ProcedureReturn Round2((Max-Min)/(510-(Max+Min))*240)
EndIf
EndProcedure
Procedure Filtre_01(ValColorS) ;<= Filtre -50% Saturation
r=Red(ValColorS):v=Green(ValColorS):b=Blue(ValColorS)
dt=(Max-Min)/2;:Debug dt
If b<>r And b<>v And r<>v ;:Debug "Trois valeurs différentes"
If Neutre$="vert"
If v>dt
v=v-(dt/3)
Else
v=v+(dt/3)
EndIf
If Max$="rouge"
r=r-(dt/3)
Else
b=b-(dt/3)
EndIf
If Min$="rouge"
r=r+(dt/3)
Else
b=b+(dt/3)
EndIf
ElseIf Neutre$="rouge"
If r>dt
r=r-(dt/3)
Else
r=r+(dt/3)
EndIf
If Max$="vert"
v=v-(dt/3)
Else
b=b-(dt/3)
EndIf
If Min$="vert"
v=v+(dt/3)
Else
b=b+(dt/3)
EndIf
ElseIf Neutre$="bleu"
If b>dt
b=b-(dt/3)
Else
b=b+(dt/3)
EndIf
If Max$="rouge"
r=r-(dt/3)
Else
v=v-(dt/3)
EndIf
If Min$="rouge"
r=r+(dt/3)
Else
v=v+(dt/3)
EndIf
EndIf
Else ;:Debug "Deux valeurs égales"
;-----------------------------
If r=v Or r=b
If r=v
If v>b
r=r-(dt/3)
v=v-(dt/3)
b=b+(dt/3)
Else
r=r+(dt/3)
v=v+(dt/3)
b=b-(dt/3)
EndIf
Else
If b>v
r=r-(dt/3)
b=b-(dt/3)
v=v+(dt/3)
Else
r=r+(dt/3)
b=b+(dt/3)
v=v-(dt/3)
EndIf
EndIf
EndIf
If b=v
If v>r
b=b-(dt/3)
v=v-(dt/3)
r=r+(dt/3)
Else
r=r-(dt/3)
v=v+(dt/3)
b=b+(dt/3)
EndIf
EndIf
EndIf
ProcedureReturn RGB(r,v,b)
EndProcedure
couleur=ColorRequester()
Debug ""
Debug "******SANS FILTRE******"
Debug "Saturation: "+Str(Saturation(couleur))+" /240"
Debug "Luminance: "+Str(Luminance(couleur))+" /240"
Debug "Info:"
Debug "Rouge: "+Str(Red(couleur))
Debug "Vert: "+Str(Green(couleur))
Debug "bleu: "+Str(Blue(couleur))
Debug ""
Debug ""
Debug "******AVEC FILTRE******"
;Debug "Luminance: "+Str(Luminance(Filtre_02(couleur,90)))+" /240"
Debug "Saturation: "+Str(Saturation(Filtre_01(couleur)))+" /240"
Debug "Lumière Après Désaturation: "+Str(Luminance(Filtre_01(couleur)))+" /240"
Debug ""
ainsi je pourais continuer mon pojet

, merci à vous
vos réactions svp

Publié : dim. 23/déc./2007 22:49
par case
sinon j'ai trouvé ce site
http://www.easyrgb.com/math.html
ca a l'air interessant pour ton projet

Re: Manipuler la saturation
Publié : dim. 23/déc./2007 23:35
par Backup
Fortix a écrit :Salutation,
Quelqu'un aurais une procedure qui permet de manipuler la saturation d'une couleur:
par exemple si la valeure de la saturation est < 120 et bien la valeur devient 120, idem si elle est > et qui renvoit la nouvelle couleur
tu veux quoi en fait ?
j'ai une procedure qui eclaircie ou fonce une couleur c'est ça que tu veux ?
"couleur luminosity"
Publié : lun. 24/déc./2007 21:06
par Fortix
Arrg c'est domage Case

, ton tyau est très intéressant mais il ne traite pas de la saturation, c'est domage , c'est domage

, et pourtant c'est la partie la plus dûre
Dobro, je veux juste trouver un moyen de manipuler la saturation d'une couleur le plus précisement possible, pour être précis :
-je veux dans un premier temps retirer 50% quelques soit la saturation capturé;
ça sera un très grand pas pour moi et surtous celà me permettra d'analiser la technique employer pour manipuler la Sat; ensuite je pourais voler de mes ailes
merci pour vos interventions
Note: actuellement je pense avoir trouvé une vague solution pour manipuler se dernier en observant des résultas:
si R=0 et V=0 et B=0
alors Sat=0
si R=255 et V=255 et B=255
alors Sat=0
si R<>0 et V<>0 et B<>0
alors Sat<>0
si R=V ou R=B et V<>B
alors Sat<>0
merci pour vos interventions

Publié : mar. 25/déc./2007 16:24
par Mytic
Essai ça :
Code : Tout sélectionner
;======================================
;= Saturation =
;======================================
Procedure.c Min(v1.c,v2.c)
If v1 > v2
ProcedureReturn v2
Else
ProcedureReturn v1
EndIf
EndProcedure
Procedure.c Max(v1.c,v2.c)
If v1 > v2
ProcedureReturn v1
Else
ProcedureReturn v2
EndIf
EndProcedure
Procedure.d RGB_TO_SAT(R.c, V.c, B.c)
Color1.d = Min(Min(R, V), B)
Color2.d = Max(Max(R, V), B)
c.d = (Color1 + Color2) / 2
If c = 0 Or c = 255
ProcedureReturn 0
Else
If c < 256 / 2
ProcedureReturn (240 * (c - Color1) / (c - 0))
Else
ProcedureReturn (240 * (Color2 - c) / (256 - c))
EndIf
EndIf
EndProcedure
Debug RGB_TO_SAT(130,150,200)
Et pour aller de la saturation à la couleur, il faut ajouter la Teinte + luminosité.
En gros, Couleur = Contraste (saturation) + teinte + luminosité.

Publié : mar. 25/déc./2007 17:11
par Fortix
Merci Mytic,

, je pense qu'on ne pourra jamais être plus précis que toi
il ne reste plus qu'à trouver un moyen de retirer 50% de la saturation obtenu et de manipule les trois canaux RVB individuellement pour augmenter ou diminuer
Plus la valeur de l'écart entre
la valeur de la couleur Max et celle de
la valeur Min est grande et plus c'est Saturé et inverse
merci pour vos réactions

Publié : mar. 25/déc./2007 17:56
par Mytic
Voilà tous les outils pour manipuler la saturation :
Code : Tout sélectionner
;======================================
;= Saturation 2 =
;======================================
Procedure.c Min(v1.c,v2.c)
If v1 > v2
ProcedureReturn v2
Else
ProcedureReturn v1
EndIf
EndProcedure
Procedure.c Max(v1.c,v2.c)
If v1 > v2
ProcedureReturn v1
Else
ProcedureReturn v2
EndIf
EndProcedure
Procedure.d RGB_TO_SAT(R.c, V.c, B.c)
Color1.d = Min(Min(R, V), B)
Color2.d = Max(Max(R, V), B)
c.d = (Color1 + Color2) / 2
If c = 0 Or c = 255
ProcedureReturn 0
Else
If c < 256 / 2
ProcedureReturn (240 * (c - Color1) / (c - 0))
Else
ProcedureReturn (240 * (Color2 - c) / (256 - c))
EndIf
EndIf
EndProcedure
Procedure.d RGB_TO_HUE(R, V, B)
sens.l = 0
plage.l = 0
Proportion.d = 0
Color1.d = Min(Min(R, V), B)
Color2.d = 0
Color3.d = Max(Max(R, V), B)
If V = Color1 And R = Color3 : Plage = 6: Color2 = B: sens = -1: EndIf
If V = Color1 And B = Color3 : Plage = 4: Color2 = R: sens = 1: EndIf
If R = Color1 And B = Color3 : Plage = 4: Color2 = V: sens = -1: EndIf
If R = Color1 And V = Color3 : Plage = 2: Color2 = B: sens = 1: EndIf
If B = Color1 And V = Color3 : Plage = 2: Color2 = R: sens = -1: EndIf
If B = Color1 And R = Color3 : Plage = 0: Color2 = V: sens = 1: EndIf
If Color3 = Color1
Proportion = 0
Else
Proportion = (Color2 - Color1) / (Color3 - Color1)
EndIf
ProcedureReturn (240 * (Plage + sens * Proportion) / 6)
EndProcedure
Procedure.d RGB_TO_INT(R, V, B)
Color1.d = Min(Min(R, V), B)
Color3.d = Min(Min(R, V), B)
ProcedureReturn (240 * ((Color1 + Color3) / 2) / 255)
EndProcedure
Procedure.l HSI_TO_Color(H.d,S.d,I.d)
HB.b = H
ColorL.d = 0
ColorH.d = 0
Plage.c = (H - 0.5) / 40
Proportion.l = (HB % 40) / 40
Select Plage
Case 0: R = 1: B = 0: V = Proportion
Case 1: V = 1: B = 0: R = 1 - Proportion
Case 2: V = 1: R = 0: B = Proportion
Case 3: B = 1: R = 0: V = 1 - Proportion
Case 4: B = 1: V = 0: R = Proportion
Case 5: R = 1: V = 0: B = 1 - Proportion
EndSelect
If I < 240 / 2
ColorL = (I / 240) * (1 - (S / 240))
ColorH = (I / 240) * (1 + (S / 240))
Else
ColorL = (I / 240) - (1 - (I / 240)) * (S / 240)
ColorH = (I / 240) + (1 - (I / 240)) * (S / 240)
EndIf
Rouge.c = 255 * (ColorL + R * (ColorH - ColorL))
Vert.c = 255 * (ColorL + V * (ColorH - ColorL))
Bleu.c = 255 * (ColorL + B * (ColorH - ColorL))
ProcedureReturn RGB(Rouge, Vert, Bleu)
EndProcedure
Debug RGB_TO_SAT(130,150,200)

Publié : mar. 25/déc./2007 18:23
par Fortix
Les Pros sont des pros

,merci Mytic
Publié : ven. 06/mars/2009 12:26
par Fortix
Salut @Mytic
j'ais un topic à problème concernant la manip avancée de la Saturation sur ce lien:
http://www.purebasic.fr/french/viewtopic.php?t=9089
tu peux nous rejoindre et nous aider stp
merci
