Revenir au sommaire Tutoriaux

 


Canvas Couleurs Pixels Palettes
Programmation des couleurs
Bitmaps
Scanlines
Masques Conclusion Références


Bitmaps

Le format utilisé par windows pour stocker des images sur disque (fichiers à extension .bmp) et aussi en mémoire est le format Bitmap.

Le format d'un bitmap est compliqué car il doit supporter les formats de 1 bit à 32 bits, les optimiser, gérer la palette associée s'il y a lieu, et finalement constituer les informations sur sa structure pour les enregistrer. De plus, les bitmaps héritent de la longue histoire des différentes versions de Windows et même d'OS2. Par exemple, les lignes de fin sont curieusement stockées au début, car autrefois certains moniteurs affichaient les images plus vite avec cette disposition.

Nous n'allons donc pas étudier les bitmaps en détail. Nous préférons approfondir les techniques les plus intéressantes pour le traitement des images, à savoir les bitmaps 24 bits (16 millions de couleurs) et les scanlines.

Formats des bitmaps - Pixelformat

La propriété PIXELFORMAT d'un Tbitmap existe à partir de Delphi3.

Pixelformat

Codage

Couleurs

Palette

Cadrage
des lignes

Commentaires

pf1bit

1 bit

2

Oui (2)

Mot

bitmap monochrome (Noir = 0, Blanc = 1)

pf4bit

4 bits

16

Oui (16)

Mot

Couleur obtenue indirectement par le rang dans la palette

pf8bit

8 bits

256

Oui (256)

Mot

Couleur obtenue indirectement par le rang dans la palette

pf15bit

16 bits

32 768

Non

Mot

5 bits par couleur (0..31) sur un mot

pf16bit

16 bits

65 536

Non

Mot

5 bits pour Rouge et Bleu et 6 bits pour le vert (0..63)

pf24bit

24 bits

16 millions

Non

Double mot

8 bits par couleur Rouge Vert Bleu

pf32bit

32 bits

16 millions

Non

Doublemot

8 bits par couleur Rouge Vert Bleu + 8 bits alpha channel utilisé diversement (ex: stockage d'un masque en niveaux de gris)

pfCustom

        bitmap non reconnu (exception EIinvalidgraphic)

pfDevice

        Device Dependent Bitmap (voir notes 1 et 2)

Note 1 - Windows gère en mémoire 2 sortes de Bitmaps
Les Device-dependent bitmaps (DDB) sont créés au format du périphérique utilisé. Ce format est conservé pour compatibilité avec les ancienne versions de Windows. Par exemple, si l'écran est configuré en 16 bits, un bitmap sera créé comme un DDB de 16 bits.

Les Device-independent bitmaps (DIB) contiennent le format et la résolution périphérique sur lequel l'image a été créée.Ils stockent aussi la palette correspondante et le mode de compression.

Note 2 - En Delphi, lorsque l'on crée un bitmap (Bmp0 := Tbitmap.create), et si vous omettez soit d'assigner son PixelFormat soit son HandleType, un Device-Dependent Bitmap (DDB) est créé avec un PixelFormatvalant pfDevice, et le HandleType sera bmDDB

Si en revanche vous affectez un PixelFormat autre que pfDevice (ex: Bmp0.pixelformat := pf24bit) ou si vous spécifiez un HandleType = bmDIB, vous obtenez un Device Independent Bitmap (DIB).

Note 3 - Kylix supporte les PixelFormats suivants : pf1bit, pf8bit, pf16bit, pf32bit, pfCustom

Pour tout les PixelFormats, la dimension de chaque scanline est ajustée au double mot.

Exemple  Lecture d'un bitmap au format Pf24bit dans une variable globale

var
 bmp0 : Tbitmap;
. . . . .
procedure Tform1.Formcreate(sender : Tobject);
begin
  bmp0 := Tbitmap.create;
end;  

procedure Tform1.FormDestroy(Sender: TObject);
begin
  bmp0.free;
end;  

procedure TForm1.Lecture;
begin
  bmp0.loadfromfile(nomdefichier);
  bmp0.pixelformat := pf24bit;
// effectue si nécessaire la conversion
end;

Exemple  Lecture d'un bitmap au format Pf24bit dans une variable locale

procedure TForm1.Lecture;
var
  bmp0 : Tbitmap;
begin
  bmp0 := Tbitmap.create;
  try
    bmp0.loadfromfile(nomdefichier);
    bmp0.pixelformat := pf24bit;
// effectue si nécessaire la conversion
    - - - - // taitement
  finally
    bmp0.free;
  end;
end;

Création d'un bitmap vide peint en blanc

var
  bmp0 : Tbitmap;
begin
  bmp0 := Tbitmap.create;
  try
    bmp0.width := 600;
    bmp0.height := 480;
    bmp0.pixelformat := pf24bit;
    with bmp0.canvas do
    begin
      brush.color := clwhite;

      //remplir avec le pinceau le rectangle à la dimension du canvas

      fillrect(cliprect);
    end;

    - - - - // taitement

  finally
    bmp0.free;
  end;
end;

Copie d'un bitmap dans un autre

 bmp1.assign(bmp0)          // copie Bmp0 dans Bmp1

Assign crée simplement un pointeur de Bmp0 vers Bmp1. Mais dès que l'on modifie Bmp1 (ou bmp0)  les bitmaps sont dissociés, c'est à dire que  Delphi crée une copie complète de Bmp0 avant que la modification ne devienne effective.

Autre possibilité

 bmp1.width := bmp0.width;
  bmp1.height := bmp0.height;
  bmp1.pixelformat := bmp0.pixelformat;    
  bmp1.canvas.draw(0,0,bmp0);

 

Retour  Suite

Revenir au sommaire Tutoriaux