BGRABitmap tutorial 5/fr
│ 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.
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.
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.
Tutoriel précédent (accès direct aux pixels) Tutoriel suivant (styles de ligne)