Sign in Join
Wiki copytemporary

BGRABitmap tutorial 4/fr: what changed

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

OldNewLine
11Ce tutoriel montre comment accéder directement aux pixels et utiliser les modèles de couleurs.
22
33### Création d'un nouveau projet
44
55Cré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]].
66
77### Dessin avec accès direct aux pixels
88
99Avec l'inspecteur d'objet, ajoutez un gestionnaire *OnPaint* et écrivez :
1010
1111``` pascal
1212procedure TForm1.FormPaint(Sender: TObject);
1313var x,y: integer;
1414 p: PBGRAPixel;
1515 image: TBGRABitmap;
1616begin
1717 image := TBGRABitmap.Create(ClientWidth,ClientHeight);
1818
1919 for y := 0 to image.Height-1 do
2020 begin
2121 p := image.Scanline[y];
2222 for x := 0 to image.Width-1 do
2323 begin
2424 p^.red := x*256 div image.Width;
2525 p^.green := y*256 div image.Height;
2626 p^.blue := 0;
2727 p^.alpha := 255;
2828 inc(p);
2929 end;
3030 end;
3131 image.InvalidateBitmap; // changé par accès direct
3232
3333 image.Draw(Canvas,0,0,True);
3434 image.free;
3535end;
3636```
3737
3838Cette 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.
3939
4040Pour 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.
4141
4242Ici, chaque composante est définie :
4343
4444``` pascal
4545p^.red := x*256 div image.Width;
4646```
4747
4848dé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.
4949
5050### Exécution du programme
5151
5252Vous 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é.
5353
54-<figure>
55-<img src="BGRATutorial4.png" title="BGRATutorial4.png" />
56-<figcaption>BGRATutorial4.png</figcaption>
57-</figure>
54+![](/wiki-images/8/8b/BGRATutorial4.png)
5855
5956### Espace de couleur HSLA
6057
6158Vous 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*.
6259
6360``` pascal
6461procedure TForm1.FormPaint(Sender: TObject);
6562var x,y: integer;
6663 p: PBGRAPixel;
6764 image: TBGRABitmap;
6865 hsla: THSLAPixel;
6966begin
7067 image := TBGRABitmap.Create(ClientWidth,ClientHeight);
7168 hsla.lightness := 32768;
7269 hsla.alpha := 65535;
7370 for y := 0 to image.Height-1 do
7471 begin
7572 p := image.Scanline[y];
7673 hsla.saturation := y*65536 div image.Height;
7774 for x := 0 to image.Width-1 do
7875 begin
7976 hsla.hue := x*65536 div image.Width;
8077 p^:= HSLAToBGRA(hsla);
8178 inc(p);
8279 end;
8380 end;
8481 image.InvalidateBitmap; // changé par accès direct
8582
8683 image.Draw(Canvas,0,0,True);
8784 image.free;
8885end;
8986```
9087
91-<figure>
92-<img src="BGRATutorial4b.png" title="BGRATutorial4b.png" />
93-<figcaption>BGRATutorial4b.png</figcaption>
94-</figure>
88+![](/wiki-images/1/1b/BGRATutorial4b.png)
9589
9690#### Correction des couleurs
9791
9892Les 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 :
9993
10094``` pascal
10195hsla.hue := GtoH(x*65536 div image.Width);
10296```
10397
10498La 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*.
10599
106100Le code précédent devient donc simplement :
107101
108102``` pascal
109103procedure TForm1.FormPaint(Sender: TObject);
110104var x,y: integer;
111105 p: PBGRAPixel;
112106 image: TBGRABitmap;
113107 hsla: THSLAPixel;
114108begin
115109 image := TBGRABitmap.Create(ClientWidth,ClientHeight);
116110 hsla.lightness := 32768;
117111 hsla.alpha := 65535;
118112 for y := 0 to image.Height-1 do
119113 begin
120114 p := image.Scanline[y];
121115 hsla.saturation := y*65536 div image.Height;
122116 for x := 0 to image.Width-1 do
123117 begin
124118 hsla.hue := x*65536 div image.Width;
125119 p^:= GSBAToBGRA(hsla);
126120 inc(p);
127121 end;
128122 end;
129123 image.InvalidateBitmap; // changé par accès direct
130124
131125 image.Draw(Canvas,0,0,True);
132126 image.free;
133127end;
134128```
135129
136130Notez que le type *THSLAPixel* est utilisé, indifféremment du modèle de couleur.
137131
138132### Exécution du programme
139133
140134Avec la correction des couleurs, le dégradé est beaucoup plus progressif et ressemble à ce qu'on obtient avec le modèle de couleur Lab.
141135
142-<figure>
143-<img src="BGRATutorial4c.png" title="BGRATutorial4c.png" />
144-<figcaption>BGRATutorial4c.png</figcaption>
145-</figure>
136+![](/wiki-images/a/a6/BGRATutorial4c.png)
146137
147138[[BGRABitmap tutorial 3/fr|Tutoriel précédent (dessiner avec la souris)]] [[BGRABitmap tutorial 5/fr|Tutoriel suivant (couches et masques)]]
148139
149140---
150141*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