Sign in Join
Wiki copytemporary

BGRABitmap tutorial 4/de

Deutsch · English · Español · Français

Dieses Tutorial zeigt, wie Sie direkt auf die Pixel zugreifen 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.

Fügen Sie einen Zeichen-Handler hinzu

Im Objektinspektor fügen Sie einen OnPaint-Handler hinzu und schreiben Sie:

pascal
procedure TForm1.FormPaint(Sender: TObject);
var x,y: integer;
    p: PBGRAPixel;
    image: TBGRABitmap;
begin
  image := TBGRABitmap.Create(ClientWidth,ClientHeight);

  for y := 0 to image.Height-1 do
  begin
    p := image.Scanline[y];
    for x := 0 to image.Width-1 do
    begin
      p^.red := x*256 div image.Width;
      p^.green := y*256 div image.Height;
      p^.blue := 0;
      p^.alpha := 255;
      inc(p);
    end;
  end;
  image.InvalidateBitmap; // geändert durch direkten Zugriff

  image.Draw(Canvas,0,0,True);
  image.free;
end;

Diese 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.

Beim 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:

pascal
p^.red := x*256 div image.Width;

Definiert 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.

Starten Sie das Programm

Sie 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.

Verwendung des HSLA Farbraumes

Sie 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'.

pascal
procedure TForm1.FormPaint(Sender: TObject);
var x,y: integer;
    p: PBGRAPixel;
    image: TBGRABitmap;
    hsla: THSLAPixel;
begin
  image := TBGRABitmap.Create(ClientWidth,ClientHeight);
  hsla.lightness := 32768;
  hsla.alpha := 65535;
  for y := 0 to image.Height-1 do
  begin
    p := image.Scanline[y];
    hsla.saturation := y*65536 div image.Height;
    for x := 0 to image.Width-1 do
    begin
      hsla.hue := x*65536 div image.Width;
      p^:= HSLAToBGRA(hsla);
      inc(p);
    end;
  end;
  image.InvalidateBitmap; // geändert durch direkten Zugriff

  image.Draw(Canvas,0,0,True);
  image.free;
end;

Farbkorrektur

Die 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:

pascal
hsla.hue := GtoH(x*65536 div image.Width);

Beachten 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.

Der Code wird einfach zu:

pascal
procedure TForm1.FormPaint(Sender: TObject);
var x,y: integer;
    p: PBGRAPixel;
    image: TBGRABitmap;
    hsla: THSLAPixel;
begin
  image := TBGRABitmap.Create(ClientWidth,ClientHeight);
  hsla.lightness := 32768;
  hsla.alpha := 65535;
  for y := 0 to image.Height-1 do
  begin
    p := image.Scanline[y];
    hsla.saturation := y*65536 div image.Height;
    for x := 0 to image.Width-1 do
    begin
      hsla.hue := x*65536 div image.Width;
      p^:= GSBAToBGRA(hsla);
      inc(p);
    end;
  end;
  image.InvalidateBitmap; // changed by direct access

  image.Draw(Canvas,0,0,True);
  image.free;
end;

Achten Sie darauf, den Typ THSLAPixel einzusetzen, unabhängig von der Korrektur des Farbmodells.

Starten Sie das Programm

Mit voller Farbkorrektur ist der Farbverlauf progressiver, und ähnelt dem, den Sie mit dem Lab-Farbmodell erhalten würden.

Voriges Tutorial (Zeichnen mit der Maus) | Nächstes Tutorial (Ebenen und Masken)


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.

Revision 2, last changed by WikiArchive .

Talk about this page

Nobody has opened a bench for this page yet. Sign in to open one.