Sign in Join
Wiki copytemporary

BGRABitmap tutorial 4/fr: what changed

Revision 0 to 1. Removed lines have a minus sign; added lines have a plus sign.

Title: BGRABitmap tutorial 4/fr

OldNewLine
1+Ce tutoriel montre comment accéder directement aux pixels et utiliser les modèles de couleurs.
2+
3+### Création d'un nouveau projet
4+
5+Créez un nouveau projet et ajoutez la référence à [[BGRABitmap]], de la même façon que dans [[BGRABitmap tutorial/fr|le premier tutoriel]].
6+
7+### Dessin avec accès direct aux pixels
8+
9+Avec l'inspecteur d'objet, ajoutez un gestionnaire *OnPaint* et écrivez :
10+
11+``` pascal
12+procedure TForm1.FormPaint(Sender: TObject);
13+var x,y: integer;
14+ p: PBGRAPixel;
15+ image: TBGRABitmap;
16+begin
17+ image := TBGRABitmap.Create(ClientWidth,ClientHeight);
18+
19+ for y := 0 to image.Height-1 do
20+ begin
21+ p := image.Scanline[y];
22+ for x := 0 to image.Width-1 do
23+ begin
24+ p^.red := x*256 div image.Width;
25+ p^.green := y*256 div image.Height;
26+ p^.blue := 0;
27+ p^.alpha := 255;
28+ inc(p);
29+ end;
30+ end;
31+ image.InvalidateBitmap; // changé par accès direct
32+
33+ image.Draw(Canvas,0,0,True);
34+ image.free;
35+end;
36+```
37+
38+Cette procédure crée une image de la même taille que la zone client disponible. Ensuite, les boucles parcourent tous les pixels pour calculer un dégradé bidimensionnel. Finalement, l'image est affichée et libérée.
39+
40+Pour accéder aux données de l'image, vous pouvez soit utiliser *Data*, si vous ne vous souciez pas de l'ordre des lignes, ou *Scanline* pour accéder à une ligne spécifique. À l'intérieur d'une ligne, les pixels sont rangés de gauche à droite.
41+
42+Ici, chaque composante est définie :
43+
44+``` pascal
45+p^.red := x*256 div image.Width;
46+```
47+
48+définit une composante de rouge variant de 0 à 255, de gauche à droite. La valeur maximale *image.Width* n'est jamais atteinte par x si bien que la composante rouge n'atteint jamais 256.
49+
50+### Exécution du programme
51+
52+Vous devriez voir une fenêtre avec un dégradé où les coins sont noir, rouge, jaune et vert. Quand vous redimensionnez la fenêtre, le dégradé est aussi redimensionné.
53+
54+<figure>
55+<img src="BGRATutorial4.png" title="BGRATutorial4.png" />
56+<figcaption>BGRATutorial4.png</figcaption>
57+</figure>
58+
59+### Espace de couleur HSLA
60+
61+Vous pouvez utiliser la teinte (*hue*), la saturation et la luminosité (*lightness*). Pour cela, déclarez un pixel *THSLAPixel*. Les valeurs vont de 0 à 65535. Pour le convertir en RGB standard, utilisez *HSLAToBGRA*.
62+
63+``` pascal
64+procedure TForm1.FormPaint(Sender: TObject);
65+var x,y: integer;
66+ p: PBGRAPixel;
67+ image: TBGRABitmap;
68+ hsla: THSLAPixel;
69+begin
70+ image := TBGRABitmap.Create(ClientWidth,ClientHeight);
71+ hsla.lightness := 32768;
72+ hsla.alpha := 65535;
73+ for y := 0 to image.Height-1 do
74+ begin
75+ p := image.Scanline[y];
76+ hsla.saturation := y*65536 div image.Height;
77+ for x := 0 to image.Width-1 do
78+ begin
79+ hsla.hue := x*65536 div image.Width;
80+ p^:= HSLAToBGRA(hsla);
81+ inc(p);
82+ end;
83+ end;
84+ image.InvalidateBitmap; // changé par accès direct
85+
86+ image.Draw(Canvas,0,0,True);
87+ image.free;
88+end;
89+```
90+
91+<figure>
92+<img src="BGRATutorial4b.png" title="BGRATutorial4b.png" />
93+<figcaption>BGRATutorial4b.png</figcaption>
94+</figure>
95+
96+#### Correction des couleurs
97+
98+Les couleurs HSLA sont gérées avec la correction gamma, mais il y a d'autres corrections possibles. Par exemple, le H signifie "hue", c'est-à-dire teinte. Dans la version classique du modèle HSLA, chaque gamme entre les couleurs primaires rouge/vert/bleu est représentée par 120°, soit 21845 couleurs dans un *THSLAPixel*. Cependant, nous ne percevons pas les mêmes différences de couleurs dans les différentes gammes. Les fonctions *HtoG* et *GtoH* permettent d'appliquer ou non une correction. G signifie que les gammes ne sont pas égales. Donc, vous pouvez obtenir des gammes de taille différentes en écrivant :
99+
100+``` pascal
101+hsla.hue := GtoH(x*65536 div image.Width);
102+```
103+
104+La gamme des oranges par exemple est alors plus étendue. Enfin, dans le modèle HSLA, l'intensité lumineuse L ne correspond pas à la luminosité perçue. Vous pouvez alors utiliser les fonctions *GSBAToBGRA* et *BGRAToGSBA* à la place des fonctions *HSLAToBGRA* et *BGRAToHSLA*. Le G signifie que la teinte n'est pas uniforme et le B que c'est la luminosité réelle (*brightness*) qui est prise en compte. Dans ce cas, il n'est pas nécessaire de faire la conversion avec *GtoH* et *HtoG*.
105+
106+Le code précédent devient donc simplement :
107+
108+``` pascal
109+procedure TForm1.FormPaint(Sender: TObject);
110+var x,y: integer;
111+ p: PBGRAPixel;
112+ image: TBGRABitmap;
113+ hsla: THSLAPixel;
114+begin
115+ image := TBGRABitmap.Create(ClientWidth,ClientHeight);
116+ hsla.lightness := 32768;
117+ hsla.alpha := 65535;
118+ for y := 0 to image.Height-1 do
119+ begin
120+ p := image.Scanline[y];
121+ hsla.saturation := y*65536 div image.Height;
122+ for x := 0 to image.Width-1 do
123+ begin
124+ hsla.hue := x*65536 div image.Width;
125+ p^:= GSBAToBGRA(hsla);
126+ inc(p);
127+ end;
128+ end;
129+ image.InvalidateBitmap; // changé par accès direct
130+
131+ image.Draw(Canvas,0,0,True);
132+ image.free;
133+end;
134+```
135+
136+Notez que le type *THSLAPixel* est utilisé, indifféremment du modèle de couleur.
137+
138+### Exécution du programme
139+
140+Avec la correction des couleurs, le dégradé est beaucoup plus progressif et ressemble à ce qu'on obtient avec le modèle de couleur Lab.
141+
142+<figure>
143+<img src="BGRATutorial4c.png" title="BGRATutorial4c.png" />
144+<figcaption>BGRATutorial4c.png</figcaption>
145+</figure>
146+
147+[[BGRABitmap tutorial 3/fr|Tutoriel précédent (dessiner avec la souris)]] [[BGRABitmap tutorial 5/fr|Tutoriel suivant (couches et masques)]]
148+
149+---
150+*From the Free Pascal wiki, page "BGRABitmap tutorial 4/fr", as it stood on 2020-02-10 after a change by Trev, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*

Back to history