BGRABitmap/fr

From Lazarus wiki
Jump to navigationJump to search

Deutsch (de) English (en) español (es) français (fr) русский (ru) 中文(中国大陆) (zh_CN)

bgrabitmap logo.jpg

Voir aussi : Développer en mode graphique

Description

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.

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).

L'image peut être dessinée sur un Canvas habituel ou bien sur une surface OpenGL.

Paquets additionnels

Certains paquets utilisent BGRABitmap pour afficher des contrôles avec de joli graphismes :

  • BGLControls : contient TBGLVirtualScreen qui permet de dessiner sur une surface OpenGL. Il se trouve dans l'archive de BGRABitmap.
  • BGRAControls : labels avec ombrage, beaux boutons, formes, etc.
  • uE Controls : indicateurs, LEDs, etc.
  • BGRAControlsFX[1]: contôles affichés sur une surface OpenGL

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 Installation Paquets.

Utiliser BGRABitmap

Tutoriels

Aperçu

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.

Certaines fonctionalités spéciales nécessitent des unités, mais vous n'en aurez peut-être pas besoin :

  • la classe TBGRAMultishapeFiller permet d'avoir une jonction avec anticrénelage entre les polygones et se trouve dans BGRAPolygon ;
  • la classe TBGRATextEffect permet d'appliquer des effets comme de l'ombrage au texte et se trouve dans BGRATextFX ;
  • les transformations 2D se trouvent dans BGRATransform ;
  • TBGRAScene3D est dans BGRAScene3D ;
  • TBGRALayeredBitmap dans BGRALayers permet d'avoir des images multicouches.

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.

À 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.

Exemple simple

Il faut copier les unités de BGRABitmap (voir le tutoriel pour plus d'explication) et les lier au projet :

Uses Classes, SysUtils, BGRABitmap, BGRABitmapTypes;

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 :

var bmp: TBGRABitmap;
begin
  bmp := TBGRABitmap.Create(100,100,BGRABlack); //création d'une image de 100x100 pixels avec un fond noir

  bmp.FillRect(20,20,60,60,BGRAWhite, dmSet); //dessine un carré blanc sans transparence
  bmp.FillRect(40,40,80,80,BGRA(0,0,255,128), dmDrawWithTransparency); //dessine un carré bleu transparent
end;

Enfin, pour afficher l'image :

procedure TFMain.FormPaint(Sender: TObject);
begin
  bmp.Draw(Canvas, 0, 0, True); // dessine l'image sur la fenêtre en mode opaque (plus rapide)
end;

Notions

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.

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.

Les fonctions de BGRABitmap proposent essentiellement 4 modes :

  • dmSet : consiste à remplacer les 4 octets par le pixel qu'on dessine, c'est-à-dire qu'on ne gère pas la transparence ;
  • dmDrawWithTransparency : effectue un mélange en prenant en compte la correction gamma (voir plus bas) ;
  • dmFastBlend ou dmLinearBlend : effectue un mélange sans correction gamma (plus rapide, mais entraîne des distorsions notamment avec les couleurs sombres) ;
  • 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)).

Fonctions de dessin intégrées

  • dessiner/effacer des pixels ;
  • dessin de lignes avec ou sans anticrénelage ;
  • coordonnées avec virgule flottante ;
  • choix de l'épaisseur du pinceau avec virgule flottante ;
  • dessin de rectangles (contour ou remplissage) ;
  • dessin d'ellipses et de polygones avec anticrénelage ;
  • calcul de splines (courbe arrondie passant par des points) ;
  • remplissage simple (Floodfill) ou progressif ;
  • rendu de gradient de couleur (linéaire, radial...) ;
  • rectangles avec coins arrondis ;
  • textes avec transparence.

Dessiner avec le Canvas

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.

Dessin en accès direct aux pixels

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.

var 
   bmp: TBGRABitmap;
   p: PBGRAPixel;
   n: integer;

begin
     bmp := TBGRABitmap.Create('image.png');
     p := bmp.Data;
     for n := bmp.NbPixels-1 downto 0 do
     begin
          p^.red := not p^.red;  //inverse le canal rouge
          inc(p);
     end;
     bmp.InvalidateBitmap;  //note qu'on a accédé directement aux pixels
     bmp.Draw(Canvas,0,0,True);
     bmp.Free;
end;

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.

Voir aussi la comparaison des méthodes d'accès direct aux pixels.

Manipulation d'images

Outre les fonctions de base, voici les filtres disponibles :

  • Median : calcule la médiane des couleurs autour de chaque pixel, ce qui arrondit les coins ;
  • Smooth : adoucit légèrement l'image (fonction complémentaire de Sharpen) ;
  • Sharpen : faire ressortir les contours (fonction complémentaire de Smooth) ;
  • Contour : dessine les contours sur fond blanc (comme un dessin au crayon) ;
  • BlurRadial : flou non directionnel ;
  • BlurMotion : flou directionnel ;
  • CustomBlur : flou selon un masque en ton de gris ;
  • Emboss : dessine les contours selon un ombrage ;
  • EmbossHighlight : dessine les contours d'une sélection (définie en ton de gris) ;
  • Grayscale : convertit en noir et blanc en tenant compte de la correction gamma ;
  • Normalize : utilise toute la plage d'intensité lumineuse disponible ;
  • Rotate : rotation de l'image autour d'un point ;
  • SmartZoom3 : effectue un zoom x3 et détecte les contours, ce qui permet d'avoir un zoom utile pour les sprites des jeux anciens.

Combinaison d'images

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 :

  • LinearBlend : superposition simple sans correction gamma (équivalent de dmFastBlend) ;
  • Transparent : superposition en tenant compte de la correction gamma ;
  • Multiply : multiplication des composantes RGB (avec correction gamma) ;
  • LinearMultiply : multiplication des composantes RGB (sans correction gamma) ;
  • Additive : addition des composantes RGB (avec correction gamma) ;
  • LinearAdd : addition des composantes RGB (sans correction gamma) ;
  • Difference : différence des composantes RGB (avec correction gamma) ;
  • LinearDifference : différence des composantes RGB (sans correction gamma) ;
  • Negation : fait disparaître les couleurs communes (avec correction gamma) ;
  • LinearNegation : fait disparaître les couleurs communes (sans correction gamma) ;
  • Reflect, Glow : pour les effets de lumière ;
  • ColorBurn, ColorDodge, Overlay, Screen : divers filtres ;
  • Lighten : conserve les couleurs les plus claires ;
  • Darken : conserve les couleurs les plus foncées ;
  • Xor : ou exclusif des composantes RGB.

Captures d'écran

Lazpaint contour.png Lazpaint curve redim.png Bgra wirecube.png Bgra chessboard.jpg

Licence

LGPL modifiée

Auteur : Johann ELSASS (Facebook)

Téléchargement

Dernière version : https://github.com/bgrabitmap/bgrabitmap/releases

Sourceforge avec LazPaint : http://sourceforge.net/projects/lazpaint/files/src/