Difference between revisions of "BGRABitmap tutorial 2/de"
m (Text replace - "delphi>" to "syntaxhighlight>") |
|||
Line 14: | Line 14: | ||
Fügen Sie dem Hauptformular eine private Variable zum Speichern des Bildes hinzu: | Fügen Sie dem Hauptformular eine private Variable zum Speichern des Bildes hinzu: | ||
− | < | + | <syntaxhighlight> TForm1 = class(TForm) |
private | private | ||
{ private Deklarationen } | { private Deklarationen } | ||
Line 20: | Line 20: | ||
public | public | ||
{ öffentliche Deklarationen } | { öffentliche Deklarationen } | ||
− | end; </ | + | end; </syntaxhighlight> |
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: | 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: | ||
− | < | + | <syntaxhighlight>procedure TForm1.FormCreate(Sender: TObject); |
begin | begin | ||
image := TBGRABitmap.Create('image.png'); | image := TBGRABitmap.Create('image.png'); | ||
− | end; </ | + | end; </syntaxhighlight> |
=== Zeichnen Sie die Bitmap === | === 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: | 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: | ||
− | < | + | <syntaxhighlight>procedure TForm1.FormPaint(Sender: TObject); |
begin | begin | ||
image.Draw(Canvas,0,0,True); | image.Draw(Canvas,0,0,True); | ||
− | end; </ | + | end; </syntaxhighlight> |
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. | 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. | ||
Line 41: | Line 41: | ||
Sie sollten jetzt den folgenden Code haben: | Sie sollten jetzt den folgenden Code haben: | ||
− | < | + | <syntaxhighlight>unit UMain; |
{$mode objfpc}{$H+} | {$mode objfpc}{$H+} | ||
Line 84: | Line 84: | ||
{$I UMain.lrs} | {$I UMain.lrs} | ||
− | end.</ | + | end.</syntaxhighlight> |
=== Starten Sie das Programm === | === Starten Sie das Programm === | ||
Line 95: | Line 95: | ||
Vielleicht wollen Sie das Bild auf dem Formular zentrieren. Dazu verändern Sie die Prozedur 'FormPaint': | Vielleicht wollen Sie das Bild auf dem Formular zentrieren. Dazu verändern Sie die Prozedur 'FormPaint': | ||
− | < | + | <syntaxhighlight>procedure TForm1.FormPaint(Sender: TObject); |
var ImagePos: TPoint; | var ImagePos: TPoint; | ||
begin | begin | ||
Line 106: | Line 106: | ||
image.Draw(Canvas,ImagePos.X,ImagePos.Y,True); | image.Draw(Canvas,ImagePos.X,ImagePos.Y,True); | ||
− | end;</ | + | end;</syntaxhighlight> |
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. | 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. | ||
Line 117: | Line 117: | ||
Um das Bild zu strecken, müssen wir ein temporäres gestrecktes Bild erzeugen: | Um das Bild zu strecken, müssen wir ein temporäres gestrecktes Bild erzeugen: | ||
− | < | + | <syntaxhighlight>procedure TForm1.FormPaint(Sender: TObject); |
var stretched: TBGRABitmap; | var stretched: TBGRABitmap; | ||
begin | begin | ||
Line 123: | Line 123: | ||
stretched.Draw(Canvas,0,0,True); | stretched.Draw(Canvas,0,0,True); | ||
stretched.Free; | stretched.Free; | ||
− | end;</ | + | end;</syntaxhighlight> |
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: | 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: | ||
− | < | + | <syntaxhighlight>stretched := image.Resample(ClientWidth, ClientHeight, rmSimpleStretch) as TBGRABitmap;</syntaxhighlight> |
Ebenso können Sie auch den Interpolationsfilter angeben mit der Eigenschaft 'ResampleFilter': | Ebenso können Sie auch den Interpolationsfilter angeben mit der Eigenschaft 'ResampleFilter': | ||
− | < | + | <syntaxhighlight>image.ResampleFilter := rfMitchell; |
− | stretched := image.Resample(ClientWidth, ClientHeight) as TBGRABitmap;</ | + | stretched := image.Resample(ClientWidth, ClientHeight) as TBGRABitmap;</syntaxhighlight> |
[[BGRABitmap tutorial/de|Erstes Tutorial]] | [[BGRABitmap tutorial 3/de|Nächstes Tutorial (Zeichnen mit der Maus)]] | [[BGRABitmap tutorial/de|Erstes Tutorial]] | [[BGRABitmap tutorial 3/de|Nächstes Tutorial (Zeichnen mit der Maus)]] | ||
[[Category:Graphics/de]] | [[Category:Graphics/de]] |
Revision as of 14:53, 24 March 2012
│ 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;