BGRABitmap tutorial 2/de
│ Deutsch (de) │ English (en) │ español (es) │ français (fr) │ русский (ru) │
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 ein Bild laden und und es auf ein Formular zeichnen 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.
Laden Sie die Bitmap
Kopieren Sie ein Bild in Ihr Projektverzeichnis. Nehmen wir an, sein Name sei image.png.
Fügen Sie dem Hauptformular eine private Variable zum Speichern des Bildes hinzu:
TForm1 = class(TForm)
private
{ private Deklarationen }
image: TBGRABitmap;
public
{ öffentliche Deklarationen }
end;
Laden Sie das Bild, wenn das Formular erzeugt wird. Dazu doppelklicken Sie auf das Formular und eine Prozedur erscheint im Codeeditor. Fügen Sie die Anweisung zum Laden hinzu:
procedure TForm1.FormCreate(Sender: TObject);
begin
image := TBGRABitmap.Create('image.png');
end;
Zeichnen Sie die Bitmap
Fügen Sie einen OnPaint-Handler hinzu. Dazu wählen Sie das Hauptformular aus, gehen zum Objektinspektor, zum Karteireiter Ereignisse und doppelklicken Sie auf die Zeile 'OnPaint'. Dann fügen Sie den Zeichenbefehl ein:
procedure TForm1.FormPaint(Sender: TObject);
begin
image.Draw(Canvas,0,0,True);
end;
Beachten Sie, dass der letzte Parameter auf 'True' gesetzt ist (was undurchsichtig = opak bedeutet). Wenn Sie wollen, dass die im Alphakanal kodierten transparenten Pixel berücksichtigt werden, dann verwenden Sie stattdessen 'False'. Aber das transparente Zeichnen auf der Standardzeichenfläche kann langsam sein. Well es also nicht notwendig ist, zeichnen Sie nur opak.
Resultierender Code
Sie sollten jetzt den folgenden Code haben:
unit UMain;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
BGRABitmap, BGRABitmapTypes;
type
{ TForm1 }
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormPaint(Sender: TObject);
private
{ private Deklarationen }
image: TBGRABitmap;
public
{ öffentliche Deklarationen }
end;
var
Form1: TForm1;
implementation
{ TForm1 }
procedure TForm1.FormCreate(Sender: TObject);
begin
image := TBGRABitmap.Create('image.png');
end;
procedure TForm1.FormPaint(Sender: TObject);
begin
image.Draw(Canvas,0,0,True);
end;
initialization
{$I UMain.lrs}
end.
Starten Sie das Programm
Sie sollten ein Formular mit dem Bild in der oberen, linken Ecke sehen.
Zentrieren des Bildes
Vielleicht wollen Sie das Bild auf dem Formular zentrieren. Dazu verändern Sie die Prozedur 'FormPaint':
procedure TForm1.FormPaint(Sender: TObject);
var ImagePos: TPoint;
begin
ImagePos := Point( (ClientWidth - Image.Width) div 2,
(ClientHeight - Image.Height) div 2 );
// Test auf eine negative Position
if ImagePos.X < 0 then ImagePos.X := 0;
if ImagePos.Y < 0 then ImagePos.Y := 0;
image.Draw(Canvas,ImagePos.X,ImagePos.Y,True);
end;
Um die Position zu bestimmen, berechnen wir den Platz zwischen dem Bild und dem linken Fensterrand (X-Koordinate) und den Platz zwischen dem Bild und dem oberen Fensterrand (Y-Koordinate). Der Ausdruck 'ClientWidth - Image.Width' gibt den verfügbaren horizontalen Platz zurück, und wir dividieren durch 2 und erhalten den linken Randabstand.
Das Ergebnis kann negativ sein, wenn das Bild breiter ist als ClientWidth. In diesem Fall setzen wir den Randabstand auf Null.
Starten Sie das Programm und beobachten Sie ob es funktioniert. Achten Sie darauf was passiert, wenn Sie den Test auf eine negative Position entfernen.
Strecken des Bildes
Um das Bild zu strecken, müssen wir ein temporäres gestrecktes Bild erzeugen:
procedure TForm1.FormPaint(Sender: TObject);
var stretched: TBGRABitmap;
begin
stretched := image.Resample(ClientWidth, ClientHeight) as TBGRABitmap;
stretched.Draw(Canvas,0,0,True);
stretched.Free;
end;
Als Vorgabe wird das Bild mit feiner Auflösung neu gezeichnet, aber Sie können angeben, ob Sie stattdessen eine einfache Streckung, die schneller ist, verwenden wollen:
stretched := image.Resample(ClientWidth, ClientHeight, rmSimpleStretch) as TBGRABitmap;
Ebenso können Sie auch den Interpolationsfilter angeben mit der Eigenschaft 'ResampleFilter':
image.ResampleFilter := rfMitchell;
stretched := image.Resample(ClientWidth, ClientHeight) as TBGRABitmap;