Bonjour,
Je cherchais comment rendre une couleur de départ en couleur pastel. Je me suis rendu compte qu'une couleur pastelle avait une luminausité de 200 minimum.

En cherchant sur le net j'ai trouvé pas mal de procédure, après avoir pioché partout j'en est repris plusieur que j'ai corrigé (enfin pas beaucoup).

Le but de la manoeuvre de cet unité est de transformer une couleur de base en pastel.

Créer un form, poser 2 panel (panel1 et panel2) relié la procédure Doubleclique du panel1 de l'unit.

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
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls, Math;

type
  TForm1 = class(TForm)
    ColorDialog1: TColorDialog;
    Panel1: TPanel;
    Panel2: TPanel;
    Procedure RGB_To_TSL(R, G, B: Integer; Out T, S, L: Integer);
    Procedure TSL_To_RGB(T, S, L: Integer; Out R, G, B: Integer);
    procedure Panel1DblClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Panel1DblClick(Sender: TObject);
Var
T,L,S : Integer;
R,G,B: Integer;
begin

  if (ColorDialog1.Execute) then
  Begin
    Panel1.Color := ColorDialog1.Color; // On récupère la valeur 

    RGB_To_TSL(
    GetRValue(ColorToRGB(ColorDialog1.Color)),
    GetGValue(ColorToRGB(ColorDialog1.Color)),
    GetBValue(ColorToRGB(ColorDialog1.Color)),
    T,S,L);

    TSL_To_RGB(T,S,210,R,G,B); // On force la luminausité à 210 pour le pastel

    Panel2.Color := RGB(R,G,B);

  end;
end;

Function Htorgb(n1, n2, hue: word): word;
Const
  HLSMAX = 240;
Begin

  If hue < 0 Then hue := HLSMAX + hue;
  If hue > HLSMAX Then hue := hue - HLSMAX;

  If hue < ((HLSMAX * 2) Div 3) Then
    Begin
      If hue < (HLSMAX Div 2) Then
        Begin
          If hue < (HLSMAX Div 6) Then
            result := (n1 + (((n2 - n1) * hue + (HLSMAX Div 12)) Div (HLSMAX Div
            6)))
          Else result := n2;
        End
      Else
        result := (n1 + (((n2 - n1) * (((HLSMAX * 2) Div 3) - hue) + (HLSMAX Div
          12)) Div (HLSMAX Div 6)));
    End
  Else
    result := n1;
End;

//
// Trouvé sur se lien PAr CIREC
// J'ai corriger le S et le L qui était à l'envers

Procedure Tform1.RGB_To_TSL(R, G, B: Integer; Out T, S, L: Integer);
Const
  HLSMAX            = 240;
  RGBMAX            = 255;
Var
  rgb               : Array[1..3] Of byte;
  cMax, cMin        : byte;
  i                 : byte;
  Rdelta, Gdelta, Bdelta: integer;
Begin
  rgb[1] := r;
  rgb[2] := g;
  rgb[3] := b;

  cMax := rgb[1];
  cMin := rgb[1];

  For i := 2 To 3 Do
    Begin
      If cMax < rgb[i] Then cMax := rgb[i];
      If cMin > rgb[i] Then cMin := rgb[i];
    End;
  L := (((cMax + cMin) * HLSMAX) + RGBMAX) Div (2 * RGBMAX);
  If cMax = Cmin Then
    Begin
      S := 0;
      T := 160;
    End
  Else
    Begin
      If (L <= (HLSMAX Div 2)) Then
        Begin
          S := (((cMax - cMin) * HLSMAX) + ((cMax + cMin) Div 2)) Div (cMax +
            cMin);
        End
      Else
        Begin
          S := (((cMax - cMin) * HLSMAX) + ((2 * RGBMAX - cMax - cMin) Div 2))
            Div (2 * RGBMAX - cMax - cMin);
        End;

      Rdelta := (((cMax - r) * (HLSMAX Div 6)) + ((cMax - cMin) Div 2)) Div (cMax
        - cMin);
      Gdelta := (((cMax - g) * (HLSMAX Div 6)) + ((cMax - cMin) Div 2)) Div (cMax
        - cMin);
      Bdelta := (((cMax - b) * (HLSMAX Div 6)) + ((cMax - cMin) Div 2)) Div (cMax
        - cMin);

      If r = cMax Then T := Bdelta - Gdelta
      Else If g = cMax Then T := (HLSMAX Div 3) + Rdelta - Bdelta
      Else T := ((2 * HLSMAX) Div 3) + Gdelta - Rdelta;
      If T < 0 Then T := HLSMAX + T;
    End;
End;

//
// Trouvé sur se lien PAr CIREC

Procedure TForm1.TSL_To_RGB(T, S, L: Integer; Out R, G, B: Integer);
Const
  HLSMAX            = 240;
  RGBMAX            = 255;
Var
  Magic1, Magic2    : word;
Begin
  If S = 0 Then
    Begin
      r := (L * RGBMAX) Div HLSMAX;
      g := r;
      b := r;
    End
  Else
    Begin
      If L <= (HLSMAX Div 2) Then
        Begin
          Magic2 := (L * (HLSMAX + S) + (HLSMAX Div 2)) Div HLSMAX;
        End
      Else
        Begin
          Magic2 := L + S - ((L * S) + (HLSMAX Div 2)) Div HLSMAX;
        End;

      Magic1 := 2 * L - Magic2;
      r := (Htorgb(Magic1, Magic2, T + (HLSMAX Div 3)) * RGBMAX + (HLSMAX Div 2))
        Div HLSMAX;
      g := (Htorgb(Magic1, Magic2, T) * RGBMAX + (HLSMAX Div 2)) Div HLSMAX;
      b := (Htorgb(Magic1, Magic2, T - (HLSMAX Div 3)) * RGBMAX + (HLSMAX Div 2))
        Div HLSMAX;
    End;
End;


End.


end.
Je n'ai rien inventé, les procédures trouvées avaient elle même été récupéré.

Je donne juste l'info, car je me suis pris la tête pendant 3 heures, et je pense que cela peu aider.