Bonjour,
J'ai des Tcolor entre les mains et j'aimerais pouvoir les éclaircir. Est-ce possible:
Bonjour,
J'ai des Tcolor entre les mains et j'aimerais pouvoir les éclaircir. Est-ce possible:
Envoyé par MiJack
Ma source: http://www.scalabium.com/faq/dct0056.htm
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 function Dark(Col: TColor; Percent: Byte): TColor; var R, G, B: Byte; begin R := GetRValue(Col); G := GetGValue(Col); B := GetBValue(Col); R := Round(R*Percent/100); G := Round(G*Percent/100); B := Round(B*Percent/100); Result := RGB(R, G, B); end; function Light(Col: TColor; Percent: Byte): TColor; var R, G, B: Byte; begin R := GetRValue(Col); G := GetGValue(Col); B := GetBValue(Col); R := Round(R*Percent/100) + Round(255 - Percent/100*255); G := Round(G*Percent/100) + Round(255 - Percent/100*255); B := Round(B*Percent/100) + Round(255 - Percent/100*255); Result := RGB(R, G, B); end;
Bon dev!
-Slimjoe
Merci, mais ça n'a pas l'air de fonctionner très bien![]()
J'envoie la fonction sur du rouge en demandant 1% de réduction de couleur :
Et en retour j'ai dû $FCFCFF, donc une couleur pratiquement blanche. Pourtant je ne crois pas voir d'erreur dans la fonction.
Code : Sélectionner tout - Visualiser dans une fenêtre à part aColor := Light($0000FF, 1) ;
essaye en tapant
par contre si tu prend tu rouge absolu ($0000FF) tu ne pourra pas l'éclairer mais juste le foncer
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 aColor := Light($0000FF, 101) ;
Pour éclaircir de 1% :Envoyé par MiJack
Code : Sélectionner tout - Visualiser dans une fenêtre à part Light($0000FF, 99);
J'ai faisEnvoyé par denokan
et j'ai eu un rouge 25% plus pâle sans problème.
Code : Sélectionner tout - Visualiser dans une fenêtre à part Light($0000FF, 75);
- Slimjoe
effectivement j'ai confondu éclaircir et foncer![]()
C'est assez étrange : si je fais un light d'un bleu à 95, j'obtiens un bleu légèrement plus clair, et si je mets 90, mon bleu devient beige clair![]()
Enfin bref, je vais me débrouiller quoi. Merci encore.
Il ne faut pas oublier de définir les limites des valeurs (Byte = 0..255) avec min et max :
Si ça t'intéresse, je possède un code plus complet qui permet d'obtenir et de redéfinir la teinte (H), la luminosité (L) et la saturation (S) d'une couleur ainsi que les valeurs RGB :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 function Dark(Col: TColor; Percent: Byte): TColor; var R, G, B: Byte; begin R := GetRValue(Col); G := GetGValue(Col); B := GetBValue(Col); R := Max(Min(Round(R*Percent/100), 255), 0); G := Max(Min(Round(G*Percent/100), 255), 0); B := Max(Min(Round(B*Percent/100), 255), 0); Result := RGB(R, G, B); end;
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157 Unit HSLUtils; Interface Uses SysUtils, Windows, Graphics, Math; Const MaxHSL: Integer = 240; Type pRGBTripleArray = ^TRGBTripleArray; TRGBTripleArray = Array[Word] Of TRGBTriple; TRGB = Record R, G, B: Byte; End; WRec = Record Lo, Hi: Byte; End; LRec = Record Lo, Hi: Word; End; Procedure RGBtoHSLRange(RGB: TColor; Var H, S, L: Integer); Function HSLRangeToRGB(H, S, L: Integer): TColor; Function GetRGB(Col: Longint): TRGB; Function SetRGB(R, G, B: Byte): Longint; Function ColorToRGBTriple(Col: Integer): TRGBTriple; {----------------------------------------------------------------} { }Implementation{ } {----------------------------------------------------------------} {----------------------------------------------------------------} Function GetRGB(Col: Longint): TRGB; Begin Result.R := 0; Result.G := 0; Result.B := 0; Try Result.B := WRec(LRec(Col).Hi).Lo; Result.G := WRec(LRec(Col).Lo).Hi; Result.R := WRec(LRec(Col).Lo).Lo; Except End; End; {----------------------------------------------------------------} Function SetRGB(R, G, B: Byte): Longint; Begin Result := 0; Try Result := (B * $10000) + (G * $100) + R; Except End; End; {----------------------------------------------------------------} Function ColorToRGBTriple(Col: Integer): TRGBTriple; Var res: TRGB; Begin Result.rgbtRed := 0; Result.rgbtGreen := 0; Result.rgbtBlue := 0; Try res := GetRGB(Col); Result.rgbtRed := res.R; Result.rgbtGreen := res.G; Result.rgbtBlue := res.B; Except End; End; {----------------------------------------------------------------} Function HSLtoRGB(H, S, L: Double): TColor; Var M1, M2, V: Double; R, G, B: Byte; {--------------------------------------------------------------} Function HueToColourValue(Hue: Double): Byte; Begin Result := 0; Try If (Hue < 0) Then Hue := Hue + 1 Else If (Hue > 1) Then Hue := Hue - 1; If (6 * Hue < 1) Then V := M1 + (M2 - M1) * Hue * 6 Else If (2 * Hue < 1) Then V := M2 Else If (3 * Hue < 2) Then V := M1 + (M2 - M1) * (2 / 3 - Hue) * 6 Else V := M1; Result := Round(255 * V); Except End; End; Begin Result := 0; Try If (S = 0) Then Begin R := Byte(Round(255 * L)); G := R; B := R; End Else Begin If (L <= 0.5) Then M2 := L * (1 + S) Else M2 := L + S - L * S; M1 := 2 * L - M2; R := HueToColourValue(H + 1 / 3); G := HueToColourValue(H); B := HueToColourValue(H - 1 / 3); End; Result := SetRGB(R, G, B); Except End; End; {----------------------------------------------------------------} Procedure RGBtoHSL(Col: TColor; Var H, S, L: Double); Var R, G, B, D, Cmax, Cmin: Double; rgb: TRGB; Begin rgb := GetRGB(Col); R := rgb.R / 255; G := rgb.G / 255; B := rgb.B / 255; Cmax := Max(R, Max(G, B)); Cmin := Min(R, Min(G, B)); L := (Cmax + Cmin) / 2; If (Cmax = Cmin) Then Begin H := 0; S := 0; End Else Begin D := Cmax - Cmin; If (L < 0.5) Then S := D / (Cmax + Cmin)Else S := D / (2 - Cmax - Cmin); If (R = Cmax) Then H := (G - B) / D Else If (G = Cmax) Then H := 2 + (B - R) / D Else H := 4 + (R - G) / D; H := H / 6; If (H < 0) Then H := H + 1; End; End; {----------------------------------------------------------------} Function HSLRangeToRGB(H, S, L: Integer): TColor; Begin Result := 0; Try Result := HSLToRGB(H / MaxHSL, S / MaxHSL, L / MaxHSL); Except End; End; {----------------------------------------------------------------} Procedure RGBtoHSLRange(RGB: TColor; Var H, S, L: Integer); Var Hd, Sd, Ld: Double; Begin RGBtoHSL(RGB, Hd, Sd, Ld); H := Round(Hd * MaxHSL); S := Round(Sd * MaxHSL); L := Round(Ld * MaxHSL); End; {----------------------------------------------------------------} End.
à+
Ah nickel, effectivement en rajoutant les Max(Min( ... )) la fonction marche cette fois parfaitement bien !!!
Merci beaucoup.
Bonjour à tous,
je sais bien que cette discussion a été déposé depuis longtemps, mais j'ai besoin de votre help.
En faite, je veux éclaircir les couleurs de mon image. J'ai essayé donc avec votre fonction Light comme ceci: Light($0000FF,99) mais un message d'erreur s'affiche dans Matlab m'indiquant que le caractere $ n'est pas valide en Matlab:
Error: The input character is not valid in MATLAB statements or expressions.
Que dois-je faire pour pouvoir executer le code et le caractere $ soit valide
Merci bien
Bonjour,
un petit rapport avec Delphi cependant :
en pascal, le préfixe $ sert pour un nombre en hexadecimal
dans d'autres langages, il peut y avoir d'autres préfixes - par exemple 0x en C
à toi de voir en Mathlab quelle est la convention utilisée.
A+
Charly
PS : mais la fonction citée est surement spécifique à Delphi.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager