Difference between revisions of "BGRABitmap/fr"

From Lazarus wiki
Jump to navigationJump to search
(→‎Description: utilisation, notions)
(→‎Fonctionalités: développements)
Line 42: Line 42:
 
* dmFastBlend ou dmLinearBlend : effectue un mélange sans correction gamma (plus rapide, mais entraine des distorsions notamment avec les couleurs sombres).
 
* dmFastBlend ou dmLinearBlend : effectue un mélange sans correction gamma (plus rapide, mais entraine des distorsions notamment avec les couleurs sombres).
  
===Fonctionalités===
+
===Fonctions de dessin intégrées===
  
Il est possible de dessiner avec des fonctions qui modifient directement l'image en mémoire, qui sont inclues dans la classe ''TBGRABitmap'', mais aussi de dessiner à l'aide d'un ''Canvas'' avec les fonctions habituelles. La seconde option est un peu plus lente parce qu'elle nécessite des transformations de l'image. L'opacité du tracé fait avec le ''Canvas'' est définie par la propriété ''CanvasOpacity''.
 
 
Les fonctions de dessins directes :
 
 
* pixels, lignes, rectangles
 
* pixels, lignes, rectangles
 
* lignes avec anti-aliasing
 
* lignes avec anti-aliasing
Line 52: Line 49:
 
* textes avec transparence
 
* textes avec transparence
 
* remplissage (flood fill), remplacer une couleur
 
* remplissage (flood fill), remplacer une couleur
* charger et sauver des images
 
* rééchantillonner, fusionner des images
 
  
Pour accéder aux pixels utilisez les propriétés ''Data'' et ''Scanline''. 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 à l'envers, selon la propriété ''LineOrder''.
+
===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.
 +
 
 +
<delphi>
 +
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);
 +
end;
 +
</delphi>
 +
 
 +
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 à l'envers, selon la propriété ''LineOrder''.
 +
 
 +
===Dessiner avec le Canvas===
 +
 
 +
Il est possible de dessiner à l'aide d'un ''Canvas'' avec les fonctions habituelles. 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.
  
 
=== Captures d'écran ===
 
=== Captures d'écran ===

Revision as of 03:25, 14 February 2011

Voir aussi : Développer en mode graphique

Description

BGRABitmap est un ensembles d'unités permettant de modifier et de créer des images avec transparence (canal alpha). L'accès direct aux pixels permet de faire des traitements rapides sur les images. La bibliothèque a été optimisée et testée sur Windows et Ubuntu, c'est-à-dire avec les widgets win32 et gtk2.

La classe principale est TBGRABitmap qui est dérivée de TFPCustomImage qui permet de créer et dessiner une image. Il y aussi TBGRAPtrBitmap qui est permet de modifier les données déjà alloués d'une image au format BGRA. Ce format consiste en quatre octets pour chaque pixel (bleu, vert, rouge et alpha dans cet ordre).

Utilisation

Il faut copier les unités de BGRABitmap et les lier au projet : <delphi> Uses Classes, SysUtils, BGRABitmap, BGRABitmapTypes; </delphi>

L'unité BGRABitmapTypes contient des définitions nécessaires la plupart du temps, mais on peut déclarer seulement BGRABitmap pour simplement charger et afficher une image. Ensuite, il faut créer un objet TBGRABitmap : <delphi> 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; </delphi>

Enfin, pour afficher l'image : <delphi> 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; </delphi>

Notions

Les pixels d'une image avec transparence sont stockées avec quatre valeurs, ici des octets, dans l'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 dessins. Le premier Le deuxième consiste à effectuer un mélange entre le pixel déjà présent et celui qu'on dessine, ce qui appelé alpha blending.

Les fonctions de BGRABitmap proposent essentiellement 3 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 entraine des distorsions notamment avec les couleurs sombres).

Fonctions de dessin intégrées

  • pixels, lignes, rectangles
  • lignes avec anti-aliasing
  • rectangles avec coins arrondis
  • textes avec transparence
  • remplissage (flood fill), remplacer une couleur

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.

<delphi> 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);

end; </delphi>

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 à l'envers, selon la propriété LineOrder.

Dessiner avec le Canvas

Il est possible de dessiner à l'aide d'un Canvas avec les fonctions habituelles. 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.

Captures d'écran

Bgra wirecube.png Bgra chessboard.jpg

Licence

LGPL modifiée

Téléchargement

Sourceforge avec LazPaint et BGRABitmap : https://sourceforge.net/projects/lazpaint/files/lazpaint/

Ancien lien : http://consume.o2switch.net/lazarus/

Installation

Ajouter BGRABitmap et BGRABitmapTypes à la clause uses.