Sign in Join
Wiki copytemporary

BGRABitmap/fr: what changed

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

Title: BGRABitmap/fr

OldNewLine
1+Voir aussi : [[Developing with Graphics/fr|Développer en mode graphique]]
2+
3+### Description
4+
5+**BGRABitmap** est un ensemble d'unités permettant de modifier et de créer des images avec transparence (canal alpha). L'accès direct aux pixels permet le traitement rapide des images. La bibliothèque a été testée avec Windows, Ubuntu et Mac OS, c'est-à-dire avec les ensembles graphiques win32, gtk1, gtk2 et carbon.
6+
7+La classe principale est *TBGRABitmap*, dérivée de *TFPCustomImage*, qui permet de créer et de dessiner une image. Il y aussi *TBGRAPtrBitmap* qui permet de modifier les données déjà allouées d'une image au format BGRA. Ce format consiste en quatre octets pour chaque pixel (bleu, vert, rouge et alpha, dans cet ordre).
8+
9+L'image peut être dessinée sur un Canvas habituel ou bien sur une [[BGRABitmap and OpenGL|surface OpenGL]].
10+
11+### Paquets additionnels
12+
13+Certains paquets utilisent BGRABitmap pour afficher des contrôles avec de joli graphismes :
14+
15+- BGLControls : contient TBGLVirtualScreen qui permet de dessiner sur une surface OpenGL. Il se trouve dans l'archive de BGRABitmap.
16+- [[BGRAControls]] : labels avec ombrage, beaux boutons, formes, etc.
17+- [[uE Controls]] : indicateurs, LEDs, etc.
18+- BGRAControlsFX[1](https://forum.lazarus.freepascal.org/index.php?topic=34534.0): contôles affichés sur une surface OpenGL
19+
20+Certains exemples dans le répertoire de test utilisent BGRAControls et BGLControls. Vous aurez peut-être besoin de les installer pour ouvrir ces projets dans Lazarus. Voir [[Install Packages/fr|Installation Paquets]].
21+
22+### Utiliser BGRABitmap
23+
24+#### Tutoriels
25+
26+- [Une introduction sympathique et pas à pas en français](https://msegui.net/tutoriels/bgrabitmap-lazarus/tutoriel.html)
27+- [[BGRABitmap tutorial/fr|Une série de tutoriels pour apprendre pas à pas]]
28+- [[BGRABitmap AggPas|Une série de projets démontrant les capacités avancées similaires à AggPas]]
29+- [Comment convertir une application de TCanvas vers BGRABitmap](http://www.youtube.com/watch?v=HGYSLgtYx-U)
30+- [Tutoriel sur developpez.com](https://lazarus.developpez.com/cours/bgrabitmap/)
31+- [[BGRABitmap tutorial TAChart/fr|Utiliser BGRABitmap pour afficher un TAChart]]
32+- [Effets de transitions d'images](https://gilles-vasseur.developpez.com/tutoriels/transitions/bgra1/)
33+- Exemples dans le [dépôt de BGRABitmap](https://github.com/bgrabitmap/bgrabitmap/tree/master/test)
34+
35+#### Aperçu
36+
37+Les fonctions ont des noms longs afin que leur usage soit intuitif. Presque tout est accessible en tant que fonction ou en utilisant une propriété de l'objet *TBGRABitmap*. Par exemple, vous pouvez utiliser *CanvasBGRA* pour avoir un canevas similaire à *TCanvas* (avec la transparence et l'anticrénelage en plus) et *Canvas2D* pour avoir les mêmes fonctionalités que le [canvas HTML](https://developer.mozilla.org/en/HTML:Canvas).
38+
39+Certaines fonctionalités spéciales nécessitent des unités, mais vous n'en aurez peut-être pas besoin :
40+
41+- la classe *TBGRAMultishapeFiller* permet d'avoir une jonction avec anticrénelage entre les polygones et se trouve dans *BGRAPolygon* ;
42+- la classe *TBGRATextEffect* permet d'appliquer des effets comme de l'ombrage au texte et se trouve dans *BGRATextFX* ;
43+- les transformations 2D se trouvent dans *BGRATransform* ;
44+- *TBGRAScene3D* est dans *BGRAScene3D* ;
45+- *TBGRALayeredBitmap* dans *BGRALayers* permet d'avoir des images multicouches.
46+
47+Le double-buffering ne fait pas vraiment partie de **BGRABitmap** parce que c'est plutôt une façon de gérer les fenêtres. Cependant, pour faire du double-buffering, vous pouvez utiliser *TBGRAVirtualScreen* qui est dans le package [[BGRAControls]].
48+
49+À part cela, le double-buffering dans **BGRABitmap** fonctionne comme tout double-buffering : vous devez avoir une image où vous stockez votre tracé et que vous affichez en une seule instruction *Draw*.
50+
51+#### Exemple simple
52+
53+Il faut copier les unités de **BGRABitmap** (voir le [[BGRABitmap tutorial 1/fr|tutoriel]] pour plus d'explication) et les lier au projet :
54+
55+``` pascal
56+Uses Classes, SysUtils, BGRABitmap, BGRABitmapTypes;
57+```
58+
59+L'unité *BGRABitmapTypes* contient des définitions nécessaires la plupart du temps. On peut déclarer seulement *BGRABitmap* pour simplement charger et afficher une image. Parfois, il faut ajouter *BGRAGraphics* si on utilise certains types hérités de la LCL. Ensuite, il faut créer un objet *TBGRABitmap* :
60+
61+``` pascal
62+var bmp: TBGRABitmap;
63+begin
64+ bmp := TBGRABitmap.Create(100,100,BGRABlack); //création d'une image de 100x100 pixels avec un fond noir
65+
66+ bmp.FillRect(20,20,60,60,BGRAWhite, dmSet); //dessine un carré blanc sans transparence
67+ bmp.FillRect(40,40,80,80,BGRA(0,0,255,128), dmDrawWithTransparency); //dessine un carré bleu transparent
68+end;
69+```
70+
71+Enfin, pour afficher l'image :
72+
73+``` pascal
74+procedure TFMain.FormPaint(Sender: TObject);
75+begin
76+ bmp.Draw(Canvas, 0, 0, True); // dessine l'image sur la fenêtre en mode opaque (plus rapide)
77+end;
78+```
79+
80+### Notions
81+
82+Les pixels d'une image avec transparence sont stockés avec quatre valeurs (ici, des octets), dans cet ordre : Bleu, Vert, Rouge, Alpha. Le dernier canal définit le niveau d'opacité (0 signifie transparent, 255 signifie opaque), et les autres canaux définissent la couleur.
83+
84+On peut distinguer deux modes de dessin. Le premier consiste à remplacer les valeurs du pixel. Le second consiste à effectuer un mélange entre le pixel déjà présent et celui qu'on dessine, ce qui est appelé l*'alpha blending*.
85+
86+Les fonctions de **BGRABitmap** proposent essentiellement 4 modes :
87+
88+- *dmSet* : consiste à remplacer les 4 octets par le pixel qu'on dessine, c'est-à-dire qu'on ne gère pas la transparence ;
89+- *dmDrawWithTransparency* : effectue un mélange en prenant en compte la correction gamma (voir plus bas) ;
90+- *dmFastBlend* ou *dmLinearBlend* : effectue un mélange sans correction gamma (plus rapide, mais entraîne des distorsions notamment avec les couleurs sombres) ;
91+- *dmXor* : effectue un "ou exclusif" avec chaque composante, y compris alpha (si vous voulez inverser la couleur sans changer la transparence, utilisez BGRA(255,255,255,0)).
92+
93+### Fonctions de dessin intégrées
94+
95+- dessiner/effacer des pixels ;
96+- dessin de lignes avec ou sans anticrénelage ;
97+- coordonnées avec virgule flottante ;
98+- choix de l'épaisseur du pinceau avec virgule flottante ;
99+- dessin de rectangles (contour ou remplissage) ;
100+- dessin d'ellipses et de polygones avec anticrénelage ;
101+- calcul de splines (courbe arrondie passant par des points) ;
102+- remplissage simple (*Floodfill*) ou progressif ;
103+- rendu de gradient de couleur (linéaire, radial...) ;
104+- rectangles avec coins arrondis ;
105+- textes avec transparence.
106+
107+### Dessiner avec le Canvas
108+
109+Il est possible de dessiner à l'aide d'un *Canvas* avec les fonctions habituelles mais sans anticrénelage. L'opacité du tracé fait avec le *Canvas* est définie par la propriété *CanvasOpacity*. Cette façon est un peu lente parce qu'elle nécessite des transformations de l'image.
110+
111+### Dessin en accès direct aux pixels
112+
113+Pour accéder aux pixels, il y a deux propriétés : *Data* et *Scanline*. La première renvoie un pointeur sur le premier pixel de l'image et la seconde un pointeur sur le premier pixel d'une ligne donnée.
114+
115+``` pascal
116+var
117+ bmp: TBGRABitmap;
118+ p: PBGRAPixel;
119+ n: integer;
120+
121+begin
122+ bmp := TBGRABitmap.Create('image.png');
123+ p := bmp.Data;
124+ for n := bmp.NbPixels-1 downto 0 do
125+ begin
126+ p^.red := not p^.red; //inverse le canal rouge
127+ inc(p);
128+ end;
129+ bmp.InvalidateBitmap; //note qu'on a accédé directement aux pixels
130+ bmp.Draw(Canvas,0,0,True);
131+ bmp.Free;
132+end;
133+```
134+
135+Il est nécessaire d'appeler ensuite la fonction *InvalidateBitmap* pour reconstruire l'image lors d'un appel à *Draw* par exemple. Notez que l'ordre les lignes peut être inversé, selon la propriété *LineOrder*.
136+
137+Voir aussi la comparaison des [[Fast direct pixel access|méthodes d'accès direct aux pixels]].
138+
139+### Manipulation d'images
140+
141+Outre les fonctions de base, voici les filtres disponibles :
142+
143+- *Median* : calcule la médiane des couleurs autour de chaque pixel, ce qui arrondit les coins ;
144+- *Smooth* : adoucit légèrement l'image (fonction complémentaire de *Sharpen*) ;
145+- *Sharpen* : faire ressortir les contours (fonction complémentaire de *Smooth*) ;
146+- *Contour* : dessine les contours sur fond blanc (comme un dessin au crayon) ;
147+- *BlurRadial* : flou non directionnel ;
148+- *BlurMotion* : flou directionnel ;
149+- *CustomBlur* : flou selon un masque en ton de gris ;
150+- *Emboss* : dessine les contours selon un ombrage ;
151+- *EmbossHighlight* : dessine les contours d'une sélection (définie en ton de gris) ;
152+- *Grayscale* : convertit en noir et blanc en tenant compte de la correction gamma ;
153+- *Normalize* : utilise toute la plage d'intensité lumineuse disponible ;
154+- *Rotate* : rotation de l'image autour d'un point ;
155+- *SmartZoom3* : effectue un zoom x3 et détecte les contours, ce qui permet d'avoir un zoom utile pour les sprites des jeux anciens.
156+
157+### Combinaison d'images
158+
159+Mis à part *PutImage*, la fonction *BlendImage* permet de combiner des images, comme les couches (*layers*) des logiciels d'édition d'image. Les modes de combinaisons sont les suivants :
160+
161+- *LinearBlend* : superposition simple sans correction gamma (équivalent de *dmFastBlend*) ;
162+- *Transparent* : superposition en tenant compte de la correction gamma ;
163+- *Multiply* : multiplication des composantes RGB (avec correction gamma) ;
164+- *LinearMultiply* : multiplication des composantes RGB (sans correction gamma) ;
165+- *Additive* : addition des composantes RGB (avec correction gamma) ;
166+- *LinearAdd* : addition des composantes RGB (sans correction gamma) ;
167+- *Difference* : différence des composantes RGB (avec correction gamma) ;
168+- *LinearDifference* : différence des composantes RGB (sans correction gamma) ;
169+- *Negation* : fait disparaître les couleurs communes (avec correction gamma) ;
170+- *LinearNegation* : fait disparaître les couleurs communes (sans correction gamma) ;
171+- *Reflect*, *Glow* : pour les effets de lumière ;
172+- *ColorBurn*, *ColorDodge*, *Overlay*, *Screen* : divers filtres ;
173+- *Lighten* : conserve les couleurs les plus claires ;
174+- *Darken* : conserve les couleurs les plus foncées ;
175+- *Xor* : ou exclusif des composantes RGB.
176+
177+### Captures d'écran
178+
179+![](/wiki-images/5/5d/Lazpaint_contour.png) ![](/wiki-images/2/25/Lazpaint_curve_redim.png) ![](/wiki-images/2/23/Bgra_wirecube.png) ![](/wiki-images/b/b0/Bgra_chessboard.jpg)
180+
181+### Licence
182+
183+LGPL modifiée
184+
185+Auteur : [Johann ELSASS](http://johann-elsass.net) ([Facebook](http://www.facebook.com/johann.elsass.1))
186+
187+### Téléchargement
188+
189+Dernière version : <https://github.com/bgrabitmap/bgrabitmap/releases>
190+
191+Sourceforge avec [[LazPaint/fr|LazPaint]] : <http://sourceforge.net/projects/lazpaint/files/src/>
192+
193+---
194+*From the Free Pascal wiki, page "BGRABitmap/fr", as it stood on 2024-03-08 after a change by Roland57, 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