Difference between revisions of "BGRABitmap tutorial 5/de"
m (added link to tut6; typos) |
m |
||
Line 1: | Line 1: | ||
{{BGRABitmap_tutorial_5}} | {{BGRABitmap_tutorial_5}} | ||
+ | |||
+ | {{BGRABitmap_tutorial_index}} | ||
Dieses Tutorial zeigt, wie Sie mit Ebenen arbeiten können. | Dieses Tutorial zeigt, wie Sie mit Ebenen arbeiten können. |
Revision as of 16:05, 3 April 2011
│ Deutsch (de) │ English (en) │ español (es) │ français (fr) │
Home | Tutorial 1 | Tutorial 2 | Tutorial 3 | Tutorial 4 | Tutorial 5 | Tutorial 6 | Tutorial 7 | Tutorial 8 | Tutorial 9 | Tutorial 10 | Tutorial 11 | Tutorial 12 | Tutorial 13 | Tutorial 14 | Tutorial 15 | Tutorial 16 | Edit
Dieses Tutorial zeigt, wie Sie mit Ebenen arbeiten können.
Erzeugen Sie ein neues Projekt
Erzeugen Sie ein neues Projekt und fügen Sie eine Referenz auf BGRABitmap hinzu, genau so wie im ersten Tutorial.
Fügen Sie einen Zeichen-Handler hinzu
Im Objektinspektor fügen Sie einen OnPaint-Handler hinzu und schreiben Sie: <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);
//Berechne den verfügbaren Platz in beide Richtungen 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>
Die Prozedur erzeugt ein Bild und füllt es mit einem blauen Farbverlauf. Dies ist die Hintergrundebene.
Die Prozedur 'DrawMoon' erzeugt eine Ebene und zeichnet einen Mond darauf. Zuerst wird eine weiße Scheibe gezeichnet, dann eine kleinere Scheibe subtrahiert. Zuletzt wird diese Ebene mit dem Hintergrund verschmolzen.
Starten Sie das Programm
Sie sollten einen Mond vor einem blauen Himmel sehen. Wenn Sie die Größe des Formulars ändern, wird auch der Gradient umgehend angepasst.
Fügen Sie eine weitere Ebene hinzu mit einer Sonne
Im OnPaint-Ereignis fügen Sie folgende Unterprozedur ein: <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>
Diese Prozedur erzeugt einen radialen Farbverlauf von rot zu orange und wendet darauf eine kreisförmige Maske an. Dies ergibt die farbige Scheibe. Zuletzt wird diese Ebene mit dem Hintergrund verschmolzen.
Rufen Sie diese Prozedur so auf, dass die Sonne nach dem Mond gezeichnet wird.
Starten Sie das Programm
Sie sollten eine Sonne und einen Mond vor einem blauen Himmel sehen. Wenn Sie die Größe des Formulars ändern, wird auch der Gradient umgehend angepasst.
Fügen Sie eine Beleuchtungsebene hinzu
Ergänzen Sie die folgende Unterprozedur im OnPaint-Ereignis: <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>
Diese Prozedur zeichnet eine Ebene mit einem weißen, radialen Farbverlauf. Sie wird mit dem Bild multipliziert.
Resultierender Code
<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>
Starten Sie das Programm
Sie sollten eine Sonne und einen Mond vor einem blauen Himmel und mit einem Lichteffekt sehen. Wenn Sie die Größe des Formulars ändern, wird auch der Gradient umgehend angepasst.
Voriges Tutorial (Direkter Zugriff auf die Pixel) Nächstes Tutorial (Linienarten)