Sign in Join
Wiki copytemporary

BGRABitmap tutorial 13/de: what changed

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

OldNewLine
11Dieses Tutorial beschreibt das Koordinatensystem von BGRABitmap.
22
33### Pixelkoordinaten
44
55Die Routinen der Standardleinwand verwenden ganzzahlige Koordinaten. Dies ist ebenfalls so bei der Eigenschaft 'CanvasBGRA', welche die Funktionen der Standardleinwand emuliert, allerdings zusätzlich mit Antialiasing (AntialiasingMode), Alphablending (Eigenschaft 'Opacity' von Pen, Brush und Font) und Gammakorrektur.
66
77Wenn wir uns nur auf die Integerkoordinaten beschränken ohne Antialiasing, dann bestimmen die Koordinaten eine Pixelposition, d.h. ein Quadrat. Wenn wir also eine Linie zeichnen von (0,0) nach (5,5), dann ist das oberste, linke Pixel auch das erste gezeichnete Pixel. Bei der Standardleinwand wird das letzte Pixel nicht gezeichnet, die Linie endet also bei (4,4).
88
9-<figure>
10-<img src="BGRATutorial13a.png" title="BGRATutorial13a.png" />
11-<figcaption>BGRATutorial13a.png</figcaption>
12-</figure>
9+![](/wiki-images/a/a3/BGRATutorial13a.png)
1310
1411Wenn wir eine Ellipse zeichnen, legt das umgebende Rechteck die Pixel fest, die wir zur Darstellung der Ellipse verwenden. Auch hier gilt, dass bei der Standardleinwand die unteren rechten Koordinaten von der Zeichnung ausgeschlossen sind, somit sind beim Füllen des Rechtecks (0,0)-(5,5) in Wirklichkeit nur die Pixel mit den Koordinaten von 0 bis 4 betroffen.
1512
1613### Fließkommakoordinaten
1714
1815Wenn wir jetzt mit dezimalen Werte arbeiten, geben die Koordinaten eine Position an, die irgendwo auf den Pixeln liegen kann. Der Wert Breite des Stiftes bedeutet eine wirkliche Distanz, nicht nur eine Anzahl von Pixeln. Was stellt (0.0,0.0) also dar?
1916
2017#### Fließkommakoordinaten ab der oberen, linken Ecke
2118
2219Es könnte beispielsweise die Distanz von der oberen, linken Ecke sein (-dies ist bei BGRABitmap aber nicht der Fall -). Dann würde diese Koordinate die obere, linke Ecke des ersten Pixels sein. Aber wenn wir das so betrachten, ist das Verhalten zwischen ganzzahligen und Fließkommakoordinaten leicht unterschiedlich. Genau, stellen Sie sich vor, wir zeichneten eine waagrechte Linie auf den Pixeln (0,1) bis (4,1). In Pixelkoordinaten wäre das die Linie (0,1)-(5,1) und die Breite wäre 1 Pixel. Nun wollen wir aber dieses Segment mit Fließkommakoordinaten definieren. Die linke Seite wäre bei 0.0, die rechte bei 5.0, das passt. Die obere Seite wäre bei 1.0 und die untere bei 2.0. Hier liegt das Problem. Die Mitte der Linie liegt bei der vertikalen Koordinate 1.5. Um also diese Linie zu zeichnen, sollten wir die Koordinaten (0.0,1.5)-(5.0,1.5) angeben.
2320
24-<figure>
25-<img src="BGRATutorial13b.png" title="BGRATutorial13b.png" />
26-<figcaption>BGRATutorial13b.png</figcaption>
27-</figure>
21+![](/wiki-images/1/18/BGRATutorial13b.png)
2822
2923Tatsächlich würde jede Linie mit der Breite 1 Pixel bei ganzzahligen Koordinaten zwischen den Pixeln gezeichnet, und dies würde mit Antialiasing zu verschwommenen Linien führen. Was bei horizontalen Koordinaten in Ordnung zu sein schien, ist in Wirklichkeit eine Illusion, denn wenn die Linie abgerundete Enden hat, sind die korrekten Koordinaten (0.5,1.5)-(4.5,1.5). Wenn wir das Problem des letzten Pixels außer Acht lassen, sehen wir, dass diese Koordinaten einfach um 0.5 größer sind.
3024
3125#### Fließkommakoordinaten ab der Pixelmitte
3226
3327Die Koordinaten könnten auch der Abstand von der Mitte des oberen, linken Pixels sein. Mit anderen Worten sind ganzzahlige Werte in der Mitte der Pixel. Dies ist bei den Funktionen von BGRABitmap der Fall. Nimmt man diese Koordinaten, dann ergibt die Linie, die die Pixel (0,1) bis (4,1) füllt, einfach (0.0,1.0)-(4.0,1.0).
3428
35-<figure>
36-<img src="BGRATutorial13c.png" title="BGRATutorial13c.png" />
37-<figcaption>BGRATutorial13c.png</figcaption>
38-</figure>
29+![](/wiki-images/6/6c/BGRATutorial13c.png)
3930
4031Dies ist aus mathematischer Sicht seltsam, aber sehr praktisch, weil Sie ganzzahlige Koordinaten verwenden können, um normale, 1 Pixel breite Linien zu zeichnen. Auf diese Weise gibt es allerdings einen leichten Unterschied im Aufruf zwischen den Funktionen von CanvasBGRA und normalen Fließkommafunktionen von BGRABitmap.
4132
4233### Erzeugen Sie ein neues Projekt
4334
4435Erzeugen Sie ein neues Projekt und fügen Sie eine Referenz auf [[BGRABitmap/de|BGRABitmap]] hinzu, genau so wie im [[BGRABitmap tutorial/de|ersten Tutorial]].
4536
4637### Canvas und BGRACanvas
4738
4839Versuchen wir zu zeigen, was auf Pixelebene passiert.
4940
5041Zuerst verwenden wir die Standardleinwand (Canvas):
5142
5243``` pascal
5344procedure TForm1.FormPaint(Sender: TObject);
5445var image: TBGRABitmap;
5546begin
5647 image := TBGRABitmap.Create(10,10);
5748 with image.Canvas do
5849 begin
5950 //einfach weiß
6051 brush.color := clWhite;
6152 FillRect(0,0,image.width,image.height);
6253 //blaue Ellipse mit schwarzem Rand
6354 brush.style := bsClear;
6455 pen.color := clBlack;
6556 Ellipse(0,0,9,9);
6657 end;
6758 /strecke das Bild, damit wir die Pixel sehen können
6859 BGRAReplace(image,image.Resample(image.Width*10,image.Height*10,rmSimpleStretch));
6960 image.Draw(Canvas,0,0,True);
7061 image.free;
7162end;
7263```
7364
7465Die Resample-Option 'rmSimpleStretch' bewahrt uns vor Interpolationsfiltern.
7566
7667Sie sollten dies erhalten:
7768
78-<figure>
79-<img src="BGRATutorial13d.png" title="BGRATutorial13d.png" />
80-<figcaption>BGRATutorial13d.png</figcaption>
81-</figure>
69+![](/wiki-images/7/75/BGRATutorial13d.png)
8270
8371Die Pixel der Koordinate 9 sind nicht gefüllt (wie bereits oben unter Umgebungsrechteck erklärt). Jetzt zeichnen wir auf die BGRACanvas. Ändern Sie einfach die 'with'-Zeile:
8472
8573``` pascal
8674with image.CanvasBGRA do
8775```
8876
8977Jetzt sollten Sie dies erhalten:
9078
91-<figure>
92-<img src="BGRATutorial13e.png" title="BGRATutorial13e.png" />
93-<figcaption>BGRATutorial13e.png</figcaption>
94-</figure>
79+![](/wiki-images/b/b0/BGRATutorial13e.png)
9580
9681Das Ergebnis ist recht ähnlich, abgesehen vom Antialiasing.
9782
9883### Tiefere Überlegungen
9984
10085Angenommen, wir wollten eine gefüllte, antialiasierte Ellipse zeichnen, die genau in eine 9x9 Bitmap passt. Wir könnten diesen Code versuchen:
10186
10287``` pascal
10388procedure TForm1.FormPaint(Sender: TObject);
10489var image: TBGRABitmap;
10590begin
10691 image := TBGRABitmap.Create(9,9,BGRAWhite);
10792 image.FillEllipseAntialias(4,4, 4,4, BGRABlack);
10893 BGRAReplace(image,image.Resample(image.Width*10,image.Height*10,rmSimpleStretch));
10994 image.Draw(Canvas,0,0,True);
11095 image.free;
11196end;
11297```
11398
11499Wir erhalten:
115100
116-<figure>
117-<img src="BGRATutorial13f.png" title="BGRATutorial13f.png" />
118-<figcaption>BGRATutorial13f.png</figcaption>
119-</figure>
101+![](/wiki-images/2/25/BGRATutorial13f.png)
120102
121103Wie Sie sehen, ist der Rand nicht vollständig gefüllt. Die Ellipse ist kleiner als erwartet. Tatsächlich liegt der Mittelpunkt der Ellipse bei (4,4) und der linke Rand bei (0,4). Aber aufgepasst, das ist die Mitte des Pixels. Wenn wir also wollen, dass die Ellipse bis zum Rand des Pixels reicht, müssen wir den Radius um 0.5 vergrößern:
122104
123105``` pascal
124106 image.FillEllipseAntialias(4,4, 4.5,4.5, BGRABlack);
125107```
126108
127-<figure>
128-<img src="BGRATutorial13g.png" title="BGRATutorial13g.png" />
129-<figcaption>BGRATutorial13g.png</figcaption>
130-</figure>
109+![](/wiki-images/4/46/BGRATutorial13g.png)
131110
132111#### Gefüllte Formen mit Canvas
133112
134113Beachten Sie, dass mit der Standardleinwand das Ergebnis sehr überraschend ausfällt. Angenommen, wir wollten das selbe wie oben machen. Wir könnten folgendes versuchen:
135114
136115``` pascal
137116 brush.color := clWhite;
138117 FillRect(0,0,image.width,image.height);
139118 brush.color := clBlue;
140119 pen.style := psClear;
141120 Ellipse(0,0,9,9);
142121```
143122
144123Wir erhalten dies:
145124
146-<figure>
147-<img src="BGRATutorial13h.png" title="BGRATutorial13h.png" />
148-<figcaption>BGRATutorial13h.png</figcaption>
149-</figure>
125+![](/wiki-images/e/eb/BGRATutorial13h.png)
150126
151127In diesem Fall wurde noch ein weiteres Pixel abgezogen. Die Ellipse ist 8 Pixel breit, wohingegen das bereitgestellte Rechteck 9 Pixel breit ist.
152128
153129[[BGRABitmap tutorial 12/de|Voriges Tutorial (Textfunktionen)]] \| [[BGRABitmap tutorial 14/de|Nächstes Tutorial (Canvas2D)]]
154130
155131---
156132*From the Free Pascal wiki, page "BGRABitmap tutorial 13/de", as it stood on 2020-02-09 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