Wiki-KopieMirror

Dies ist ein Mirror des Wikis von pascal.chat. Bearbeiten, Verlauf und Anmeldung finden dort statt.

BGRABitmap/de

Deutsch · English · Español · Français · Русский · 中文(中国)

Siehe auch: Entwickung mit Grafik

Beschreibung

BGRABitmap ist eine Sammlung von Units zum Erzeugen und Modifizieren von Bildern mit Transparenzinformationen (Alphakanal). Der direkte Zugriff auf einzelne Pixels erlaubt eine schnelle Bildbearbeitung. Diese Bibliothek wurde optimiert und getestet unter Windows, Ubuntu und Mac OS X, mit den Schnittstellen win32, gtk1, gtk2 und carbon.

Die Hauptklasse ist TBGRABitmap, die von TFPCustomImage abgeleitet wurde. Es gibt auch eine Klasse TBGRAPtrBitmap, die es erlaubt, bereits allozierte BGRA-Daten zu bearbeiten. Dieses Format besteht aus 4 Bytes pro Pixel (blau, grün, rot und alpha; in dieser Reihenfolge).

Verwendung von BGRABitmap

Tutorial

Overview

Die Funktionen haben lange Namen um verstehbar zu sein. Nahezu Alles ist erreichbar über eine Funktion oder eine Eigenschaft des TBGRABitmap-Objekts. Beispielsweise können Sie CanvasBGRA benutzen, um eine Zeichenfläche ähnlich zu TCanvas (mit Transparenz und Antialiasing) zu erhalten; und mit Canvas2D haben Sie die gleichen Merkmale wie bei HTML canvas.

Einige besondere Merkmale erfordern bestimmte Units, aber möglicherweise benötigen Sie diese nicht:

Die Doppel-Pufferung ist kein Bestandteil von BGRABitmap, weil es dabei mehr um den Umgang mit Forms geht. Um ein Double-buffering zu machen, können Sie TBGRAVirtualScreen aus dem BGRAControls-Package verwenden.

Abgesehen davon, arbeitet die Doppel-Pufferung in BGRABitmap wie gewohnt. Sie benötigen eine Bitmap, wo Sie Ihre Zeichnung speichern, und zeigen diese mit der Einzelanweisung Draw an.

Einfaches Beispiel

Sie kopieren dazu die BGRABitmap-Units und linken sie zu Ihrem Projekt:

pascal
Uses 
  Classes, SysUtils, BGRABitmap, BGRABitmapTypes;

Die Unit BGRABitmapTypes enthält alle notwendigen Definitionen, aber Sie können auch einfach eine Variable vom Typ BGRABitmap deklarieren, um eine Bitmap zu laden und anzuzeigen. Dann ist der erste Schritt der, ein TBGRABitmap-Objekt zu erzeugen:

pascal
var 
  bmp: TBGRABitmap;
begin
  bmp := TBGRABitmap.Create(100, 100, BGRABlack); // erzeugt ein 100x100 Pixel großes Bild mit schwarzem Hintergrund

  bmp.FillRect(20, 20, 60, 60, BGRAWhite, dmSet); // zeichnet ein weißes Quadrat ohne Transparenz
  bmp.FillRect(40, 40, 80, 80, BGRA(0, 0, 255, 128), dmDrawWithTransparency); // zeichnet ein transparentes blaues Quadrat
end;

Zuletzt wird die Bitmap angezeigt:

pascal
procedure TFMain.FormPaint(Sender: TObject);
begin
  bmp.Draw(Canvas, 0, 0, True); // zeichnet die Bitmap im opaquen Modus (schneller)
end;

Anmerkungen

Die Pixels in einer transparenten Bitmap werden in 4 Werten gespeichert, also 4 Bytes in der Reihenfolge Blau, Grün, Rot, Alpha. Der letzte Kanal definiert die Transparenzstufe (0 bedeutet transparent, 255 bedeutet undurchsichtig/opak), die anderen Kanäle definieren die Farbe und die Luminosität.

Grundsätzlich gibt es zwei Zeichenmodi. Der erste besteht darin, die Inhaltsinformation eines Pixels vollständig zu ersetzen. Die zweite besteht darin, das vorhandene Pixel mit einem anderen zu überblenden, das nennt man Alphablending.

Die BGRABitmap-Funktionen bieten dazu 4 Modi an:

Integrierte Zeichenfunktionen

Zeichnen auf der Leinwand

Sie können mit einem Canvas-Objekt zeichnen, mit den üblichen Funktionen, aber ohne Antialiasing. Die Opazität (Undurchsichtbarkeit) der Zeichnung ist durch die Eigenschaft CanvasOpacity definiert. Dieses Verfahren ist langsamer, weil dazu Bildumformungen angewendet werden.

Direkter Zugriff auf ein Pixel

Zur direkten Bearbeitung von Pixels gibt es zwei Eigenschaften, Data und Scanline. Die erste gibt einen Zeiger auf das erste Pixel im Bild zurück, die zweite hingegen einen Zeiger auf das erste Pixel einer bestimmten Zeile.

pascal
var 
  bmp: TBGRABitmap;
  p: PBGRAPixel;
  n: integer;

begin
  bmp := TBGRABitmap.Create('image.png');
  p := bmp.Data;
  for n := bmp.NbPixels-1 downto 0 do begin
    p^.red := not p^.red;   // invertiert den roten Kanal
    inc(p);
  end;
  bmp.InvalidateBitmap;     // beachten Sie, dass wir direkt auf die Pixels zugegriffen haben
  bmp.Draw(Canvas, 0, 0, True);
  bmp.Free;
end;

Es ist erforderlich, die Funktion InvalidateBitmap aufzurufen, um das Bild beim nächsten Aufruf von Draw neu zeichnen zu lassen. Beachten Sie: Die Reihenfolge der Zeilen kann auch umgekehrt sein, abhängig von der Eigenschaft LineOrder.

Siehe auch den Vergleich zwischen verschiedenen Methoden des direkten Pixel-Zugriffs.

Bildmanipulation

Verfügbare Filter (mit der Vorsilbe Filter):

Einige Funktionen scheinen nicht als Filter auf, weil sie kein neu erstelltes Bild zurückliefern. Sie verändern das vorhandene Bild:

Bildüberblendung

PutImage (= Ersetzen) ist die normale Zeichenfunktion. Im Gegensatz dazu erlaubt es BlendImage, Bilder zu überblenden, wie mittels Ebenen bei kommerziellen Bildbearbeitungsprogrammen. Die folgenden Modi sind verfügbar:

Diese Modi können in TBGRALayeredBitmap benutzt werden, was es etwas vereinfacht, weil BlendImage nur die grundlegenden Überblendungsoperationen bietet.

Screenshots

Lizenz

modified LGPL

Autor: Johann ELSASS (Facebook)

Download

Letzte Version : https://github.com/bgrabitmap/bgrabitmap/releases

Paket von Sourceforge enthält LazPaint : http://sourceforge.net/projects/lazpaint/files/src/ (veraltet max. ver.9.2.2)

GitHub: https://github.com/bgrabitmap/lazpaint/


From the Free Pascal wiki, page "BGRABitmap/de", as it stood on 2022-09-11 after a change by Circular, 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.

Version 3, zuletzt geändert von WikiArchive .