BGRABitmap/fr: what changed
Revision 0 to 1. Removed lines have a minus sign; added lines have a plus sign.
Title: BGRABitmap/fr
| Old | New | Line | |
|---|---|---|---|
| 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 | + |     | |
| 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).* |
