Sign in Join
Wiki copytemporary

BGRABitmap tutorial 2/de: what changed

Revision 1 to 2. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
11Dieses Tutorial zeigt, wie Sie ein Bild laden und und es auf ein Formular zeichnen können.
22
33### Erzeugen Sie ein neues Projekt
44
55Erzeugen Sie ein neues Projekt und fügen Sie eine Referenz auf [[BGRABitmap/de|BGRABitmap]] hinzu, genau so wie im [[BGRABitmap tutorial/de|ersten Tutorial]].
66
77### Laden Sie die Bitmap
88
99Kopieren Sie ein Bild in Ihr Projektverzeichnis. Nehmen wir an, sein Name sei *image.png*.
1010
1111Fügen Sie dem Hauptformular eine private Variable zum Speichern des Bildes hinzu:
1212
1313``` pascal
1414 TForm1 = class(TForm)
1515 private
1616 { private Deklarationen }
1717 image: TBGRABitmap;
1818 public
1919 { öffentliche Deklarationen }
2020 end;
2121```
2222
2323Laden 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:
2424
2525``` pascal
2626procedure TForm1.FormCreate(Sender: TObject);
2727begin
2828 image := TBGRABitmap.Create('image.png');
2929end;
3030```
3131
3232### Zeichnen Sie die Bitmap
3333
3434Fü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:
3535
3636``` pascal
3737procedure TForm1.FormPaint(Sender: TObject);
3838begin
3939 image.Draw(Canvas,0,0,True);
4040end;
4141```
4242
4343Beachten 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.
4444
4545### Resultierender Code
4646
4747Sie sollten jetzt den folgenden Code haben:
4848
4949``` pascal
5050unit UMain;
5151
5252{$mode objfpc}{$H+}
5353
5454interface
5555
5656uses
5757 Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
5858 BGRABitmap, BGRABitmapTypes;
5959
6060type
6161 { TForm1 }
6262
6363 TForm1 = class(TForm)
6464 procedure FormCreate(Sender: TObject);
6565 procedure FormPaint(Sender: TObject);
6666 private
6767 { private Deklarationen }
6868 image: TBGRABitmap;
6969 public
7070 { öffentliche Deklarationen }
7171 end;
7272
7373var
7474 Form1: TForm1;
7575
7676implementation
7777
7878{ TForm1 }
7979
8080procedure TForm1.FormCreate(Sender: TObject);
8181begin
8282 image := TBGRABitmap.Create('image.png');
8383end;
8484
8585procedure TForm1.FormPaint(Sender: TObject);
8686begin
8787 image.Draw(Canvas,0,0,True);
8888end;
8989
9090initialization
9191 {$I UMain.lrs}
9292
9393end.
9494```
9595
9696### Starten Sie das Programm
9797
9898Sie sollten ein Formular mit dem Bild in der oberen, linken Ecke sehen.
9999
100-<figure>
101-<img src="BGRATutorial2.png" title="BGRATutorial2.png" />
102-<figcaption>BGRATutorial2.png</figcaption>
103-</figure>
100+![](/wiki-images/d/db/BGRATutorial2.png)
104101
105102### Zentrieren des Bildes
106103
107104Vielleicht wollen Sie das Bild auf dem Formular zentrieren. Dazu verändern Sie die Prozedur 'FormPaint':
108105
109106``` pascal
110107procedure TForm1.FormPaint(Sender: TObject);
111108var ImagePos: TPoint;
112109begin
113110 ImagePos := Point( (ClientWidth - Image.Width) div 2,
114111 (ClientHeight - Image.Height) div 2 );
115112
116113 // Test auf eine negative Position
117114 if ImagePos.X < 0 then ImagePos.X := 0;
118115 if ImagePos.Y < 0 then ImagePos.Y := 0;
119116
120117 image.Draw(Canvas,ImagePos.X,ImagePos.Y,True);
121118end;
122119```
123120
124121Um 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.
125122
126123Das Ergebnis kann negativ sein, wenn das Bild breiter ist als ClientWidth. In diesem Fall setzen wir den Randabstand auf Null.
127124
128125Starten Sie das Programm und beobachten Sie ob es funktioniert. Achten Sie darauf was passiert, wenn Sie den Test auf eine negative Position entfernen.
129126
130127### Strecken des Bildes
131128
132129Um das Bild zu strecken, müssen wir ein temporäres gestrecktes Bild erzeugen:
133130
134131``` pascal
135132procedure TForm1.FormPaint(Sender: TObject);
136133var stretched: TBGRABitmap;
137134begin
138135 stretched := image.Resample(ClientWidth, ClientHeight) as TBGRABitmap;
139136 stretched.Draw(Canvas,0,0,True);
140137 stretched.Free;
141138end;
142139```
143140
144141Als 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:
145142
146143``` pascal
147144stretched := image.Resample(ClientWidth, ClientHeight, rmSimpleStretch) as TBGRABitmap;
148145```
149146
150147Ebenso können Sie auch den Interpolationsfilter angeben mit der Eigenschaft 'ResampleFilter':
151148
152149``` pascal
153150image.ResampleFilter := rfMitchell;
154151stretched := image.Resample(ClientWidth, ClientHeight) as TBGRABitmap;
155152```
156153
157154[[BGRABitmap tutorial 1/de|Erstes Tutorial]] \| [[BGRABitmap tutorial 3/de|Nächstes Tutorial (Zeichnen mit der Maus)]]
158155
159156---
160157*From the Free Pascal wiki, page "BGRABitmap tutorial 2/de", as it stood on 2020-02-10 after a change by Trev, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*

Back to history