Sign in Join
Wiki copytemporary

BGRABitmap tutorial 4/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 direkt auf die Pixel zugreifen 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### Fügen Sie einen Zeichen-Handler hinzu
88
99Im Objektinspektor fügen Sie einen OnPaint-Handler hinzu und schreiben Sie:
1010
1111``` pascal
1212procedure TForm1.FormPaint(Sender: TObject);
1313var x,y: integer;
1414 p: PBGRAPixel;
1515 image: TBGRABitmap;
1616begin
1717 image := TBGRABitmap.Create(ClientWidth,ClientHeight);
1818
1919 for y := 0 to image.Height-1 do
2020 begin
2121 p := image.Scanline[y];
2222 for x := 0 to image.Width-1 do
2323 begin
2424 p^.red := x*256 div image.Width;
2525 p^.green := y*256 div image.Height;
2626 p^.blue := 0;
2727 p^.alpha := 255;
2828 inc(p);
2929 end;
3030 end;
3131 image.InvalidateBitmap; // geändert durch direkten Zugriff
3232
3333 image.Draw(Canvas,0,0,True);
3434 image.free;
3535end;
3636```
3737
3838Diese Prozedur erzeugt eine Bitmap von der selben Größe wie der verfügbare Clientspace. Dann greifen die Schleifen direkt auf die Pixeldaten zu und erstellen einen bidirektionalen Farbverlauf. Zuletzt wird das Bild gezeichnet und der Speicher freigegeben.
3939
4040Beim Zugriff auf die Bitmapdaten verwenden Sie entweder Data (wenn es nicht auf die Reihenfolge der Zeilen ankommt) oder Scanline (greift auf eine bestimmte Zeile zu). Innerhalb einer Zeile sind die Pixel von links nach rechts angeordnet. Dadurch ist jede Komponente definiert. Zum Beispiel:
4141
4242``` pascal
4343p^.red := x*256 div image.Width;
4444```
4545
4646Definiert einen Rotanteil, der von 0 (links) bis 255 (rechts) reicht. Der Maximalwert von 'image.Width' wird nie durch x erreicht und somit erreicht auch der Rotanteil nie 256.
4747
4848### Starten Sie das Programm
4949
5050Sie sollten ein Formular mit einem Farbverlauf sehen. Die Ecken sind schwarz, rot, gelb und grün. Wenn Sie die Größe des Formulars ändern, wird auch der Gradient umgehend angepasst.
5151
52-<figure>
53-<img src="BGRATutorial4.png" title="BGRATutorial4.png" />
54-<figcaption>BGRATutorial4.png</figcaption>
55-</figure>
52+![](/wiki-images/8/8b/BGRATutorial4.png)
5653
5754### Verwendung des HSLA Farbraumes
5855
5956Sie können auch die HSLA-Farbskala ansprechen (Hue=Farbton, Saturation=Sättigung, Lightness=Helligkeit). Dazu deklarieren Sie ein THSLAPixel. Seine Werte reichen von 0 bis 65535. Um es in ein Standard-RGB-Pixel zu konvertieren, verwenden Sie die Routine 'HSLAToBGRA'.
6057
6158``` pascal
6259procedure TForm1.FormPaint(Sender: TObject);
6360var x,y: integer;
6461 p: PBGRAPixel;
6562 image: TBGRABitmap;
6663 hsla: THSLAPixel;
6764begin
6865 image := TBGRABitmap.Create(ClientWidth,ClientHeight);
6966 hsla.lightness := 32768;
7067 hsla.alpha := 65535;
7168 for y := 0 to image.Height-1 do
7269 begin
7370 p := image.Scanline[y];
7471 hsla.saturation := y*65536 div image.Height;
7572 for x := 0 to image.Width-1 do
7673 begin
7774 hsla.hue := x*65536 div image.Width;
7875 p^:= HSLAToBGRA(hsla);
7976 inc(p);
8077 end;
8178 end;
8279 image.InvalidateBitmap; // geändert durch direkten Zugriff
8380
8481 image.Draw(Canvas,0,0,True);
8582 image.free;
8683end;
8784```
8885
89-<figure>
90-<img src="BGRATutorial4b.png" title="BGRATutorial4b.png" />
91-<figcaption>BGRATutorial4b.png</figcaption>
92-</figure>
86+![](/wiki-images/1/1b/BGRATutorial4b.png)
9387
9488#### Farbkorrektur
9589
9690Die HSLA-Farben haben eine Gamma-Korrektur, aber es gibt auch andere mögliche Korrekturen. Beispielsweise steht H für "Hue" (= Farbton). In der klassischen Version des HSLA-Modells ist jeder Bereich zwischen den Primärfarben (rot/grün/blau) in 120 Grad unterteilt, wodurch sich 21845 Farben in THSLAPixel ergeben. Allerdings können wir die Farbunterschiede in diesen verschiedenen Bereichen nicht gleichermaßen empfinden. Die Funktionen HtoG und GtoH aaktivieren bzw. deaktivieren eine Korrektur, wodurch im G-Farbbereich die Teilbereiche nicht mehr dieselbe Größe haben. Um einen korrigierten Farbton zu erhalten, schreiben Sie:
9791
9892``` pascal
9993hsla.hue := GtoH(x*65536 div image.Width);
10094```
10195
10296Beachten Sie, dass der Bereich der Orangetöne breiter wird. Zuletzt entspricht im HSLA-Modell die Helligkeit L (lightness) nicht der empfundenen Helligkeit. Anstatt nur den Farbton zu korrigieren, können Sie GSBAToBGRA und BGRAToGSBA anstelle von HLSAToBGRA und BGRAToHSLA verwenden. Das G bedeutet hier, dass der Farbton automatisch korrigiert wird und das B (Brightness) steht für die empfundene Helligkeit (manchmal auch Beleuchtung genannt), die hier ebenfalls Berücksichtigung findet. So müssen Sie nicht ausdrücklich GtoH und HtoG aufrufen.
10397
10498Der Code wird einfach zu:
10599
106100``` pascal
107101procedure TForm1.FormPaint(Sender: TObject);
108102var x,y: integer;
109103 p: PBGRAPixel;
110104 image: TBGRABitmap;
111105 hsla: THSLAPixel;
112106begin
113107 image := TBGRABitmap.Create(ClientWidth,ClientHeight);
114108 hsla.lightness := 32768;
115109 hsla.alpha := 65535;
116110 for y := 0 to image.Height-1 do
117111 begin
118112 p := image.Scanline[y];
119113 hsla.saturation := y*65536 div image.Height;
120114 for x := 0 to image.Width-1 do
121115 begin
122116 hsla.hue := x*65536 div image.Width;
123117 p^:= GSBAToBGRA(hsla);
124118 inc(p);
125119 end;
126120 end;
127121 image.InvalidateBitmap; // changed by direct access
128122
129123 image.Draw(Canvas,0,0,True);
130124 image.free;
131125end;
132126```
133127
134128Achten Sie darauf, den Typ THSLAPixel einzusetzen, unabhängig von der Korrektur des Farbmodells.
135129
136130### Starten Sie das Programm
137131
138132Mit voller Farbkorrektur ist der Farbverlauf progressiver, und ähnelt dem, den Sie mit dem Lab-Farbmodell erhalten würden.
139133
140-<figure>
141-<img src="BGRATutorial4c.png" title="BGRATutorial4c.png" />
142-<figcaption>BGRATutorial4c.png</figcaption>
143-</figure>
134+![](/wiki-images/a/a6/BGRATutorial4c.png)
144135
145136[[BGRABitmap tutorial 3/de|Voriges Tutorial (Zeichnen mit der Maus)]] \| [[BGRABitmap tutorial 5/de|Nächstes Tutorial (Ebenen und Masken)]]
146137
147138---
148139*From the Free Pascal wiki, page "BGRABitmap tutorial 4/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