BGRABitmap tutorial 2/de

From Lazarus wiki
Jump to: navigation, search

Deutsch (de) | English (en) | Français (fr) | Español (es) | Edit

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.

BGRATutorial2.png

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;

Erstes Tutorial | Nächstes Tutorial (Zeichnen mit der Maus)