BGRABitmap tutorial 5/fr

From Free Pascal wiki
Revision as of 17:01, 4 April 2011 by Circular (talk | contribs) (créée)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigationJump to search

Deutsch (de) English (en) español (es) français (fr)


Accueil | Tutoriel 1 | Tutoriel 2 | Tutoriel 3 | Tutoriel 4 | Tutoriel 5 | Tutoriel 6 | Tutoriel 7 | Tutoriel 8 | Tutoriel 9 | Tutoriel 10 | Tutoriel 11 | Tutoriel 12 | Edit

Ce tutoriel montre comment utiliser les couches et les masques.

Création d'un nouveau projet

Créez un nouveau projet et ajouter la référence à BGRABitmap, de la même façon que dans le premier tutoriel.

Ajout d'un dessin

Avec l'inspecteur de projet, ajouter un gestionnaire OnPaint : <delphi>procedure TForm1.FormPaint(Sender: TObject); var image: TBGRABitmap;

   size: single;
 procedure DrawMoon;
 var layer: TBGRABitmap;
 begin
   layer := TBGRABitmap.Create(image.Width,image.Height);
   layer.FillEllipseAntialias(layer.Width/2,layer.Height/2,size*0.4,size*0.4,BGRA(224,224,224,128));
   layer.EraseEllipseAntialias(layer.Width/2+size*0.15,layer.Height/2,size*0.3,size*0.3,255);
   image.PutImage(0,0,layer,dmDrawWithTransparency);
   layer.Free;
 end;

begin

 image := TBGRABitmap.Create(ClientWidth,ClientHeight);
 //Compute available space in both directions
 if image.Height < image.Width then
   size := image.Height
 else
   size := image.Width;
 image.GradientFill(0,0,image.Width,image.Height,
                    BGRA(128,192,255),BGRA(0,0,255),
                    gtLinear,PointF(0,0),PointF(0,image.Height),
                    dmSet);
 DrawMoon;
 image.Draw(Canvas,0,0,True);
 image.free;

end; </delphi>

La procédure crée un image et la remplit avec un dégradé bleu. Il s'agit de la couche d'arrière-plan.

La procédure DrawMoon crée une couche, dessine une lune dessus. D'abord un disque blanc est dessiné, puis un plus petit disque est soustrait. Finalement, cette couche est fusionnée avec l'arrière-plan.

Exécution du programme

Vous devriez voir un ciel bleu avec une lune. Quand vous redimensionnez la fenêtre, l'image est aussi redimensionnée.

Tutorial5a.png

Ajout d'un soleil

Dans l'événement OnPaint, ajouter la sous-procédure : <delphi> procedure DrawSun;

 var layer,mask: TBGRABitmap;
 begin
   layer := TBGRABitmap.Create(image.Width,image.Height);
   layer.GradientFill(0,0,layer.Width,layer.Height,
                      BGRA(255,255,0),BGRA(255,0,0),
                      gtRadial,PointF(layer.Width/2,layer.Height/2-size*0.15),PointF(layer.Width/2+size*0.45,layer.Height/2-size*0.15),
                      dmSet);
   mask := TBGRABitmap.Create(layer.Width,layer.Height,BGRABlack);
   mask.FillEllipseAntialias(layer.Width/2+size*0.15,layer.Height/2,size*0.25,size*0.25,BGRAWhite);
   layer.ApplyMask(mask);
   mask.Free;
   image.PutImage(0,0,layer,dmDrawWithTransparency);
   layer.Free;
 end;   </delphi>

Cette procédure crée un dégradé radial de rouge et orange et applique un masque circulaire. Cela donne un disque coloré. Finalement, le disque est fusionné avec le fond.

Ajoutez un appel à cette procédure après la lune.

Exécution du programme

Vous devriez voir un ciel bleu avec une lune et un soleil. Quand la fenêtre est redimensionnée, l'image est aussi redimensionnée.

BGRATutorial5b.png

Ajout d'une lumière

Ajoutez la sous-procédure suivante dans l'événement OnPaint : <delphi> procedure ApplyLight;

 var layer: TBGRABitmap;
 begin
   layer := TBGRABitmap.Create(image.Width,image.Height);
   layer.GradientFill(0,0,layer.Width,layer.Height,
                      BGRA(255,255,255),BGRA(64,64,64),
                      gtRadial,PointF(layer.Width*5/6,layer.Height/2),PointF(layer.Width*1/3,layer.Height/4),
                      dmSet);
   image.BlendImage(0,0,layer,boMultiply);
   layer.Free;
 end;</delphi>

Cette procédure dessine une couche avec un degradé radial blanc. Elle est ensuite appliqué à l'image par multiplication.

Code résultant

<delphi>procedure TForm1.FormPaint(Sender: TObject); var image: TBGRABitmap;

   size: single;
 procedure DrawMoon;
 var layer: TBGRABitmap;
 begin
   layer := TBGRABitmap.Create(image.Width,image.Height);
   layer.FillEllipseAntialias(layer.Width/2,layer.Height/2,size*0.4,size*0.4,BGRA(224,224,224,128));
   layer.EraseEllipseAntialias(layer.Width/2+size*0.15,layer.Height/2,size*0.3,size*0.3,255);
   image.PutImage(0,0,layer,dmDrawWithTransparency);
   layer.Free;
 end;
 procedure DrawSun;
 var layer,mask: TBGRABitmap;
 begin
   layer := TBGRABitmap.Create(image.Width,image.Height);
   layer.GradientFill(0,0,layer.Width,layer.Height,
                      BGRA(255,255,0),BGRA(255,0,0),
                      gtRadial,PointF(layer.Width/2,layer.Height/2-size*0.15),PointF(layer.Width/2+size*0.45,layer.Height/2-size*0.15),
                      dmSet);
   mask := TBGRABitmap.Create(layer.Width,layer.Height,BGRABlack);
   mask.FillEllipseAntialias(layer.Width/2+size*0.15,layer.Height/2,size*0.25,size*0.25,BGRAWhite);
   layer.ApplyMask(mask);
   mask.Free;
   image.PutImage(0,0,layer,dmDrawWithTransparency);
   layer.Free;
 end;
 procedure ApplyLight;
 var layer: TBGRABitmap;
 begin
   layer := TBGRABitmap.Create(image.Width,image.Height);
   layer.GradientFill(0,0,layer.Width,layer.Height,
                      BGRA(255,255,255),BGRA(64,64,64),
                      gtRadial,PointF(layer.Width*5/6,layer.Height/2),PointF(layer.Width*1/3,layer.Height/4),
                      dmSet);
   image.BlendImage(0,0,layer,boMultiply);
   layer.Free;
 end;

begin

 image := TBGRABitmap.Create(ClientWidth,ClientHeight);
 if image.Height < image.Width then
   size := image.Height
 else
   size := image.Width;
 image.GradientFill(0,0,image.Width,image.Height,
                    BGRA(128,192,255),BGRA(0,0,255),
                    gtLinear,PointF(0,0),PointF(0,image.Height),
                    dmSet);
 DrawMoon;
 DrawSun;
 ApplyLight;
 image.Draw(Canvas,0,0,True);
 image.free;

end;</delphi>

Exécution du programme

Vous devriez voir un ciel bleu avec une lune et un soleil, avec un effet de lumière.

Tutorial5c.png

Tutoriel précédent (accès direct aux pixels) Tutoriel suivant (styles de ligne)