4. Grafikbearbeitung in FireMonkey

FireMonkey TBitmap versus Windows TBitmap

Das Windows-Bitmap und das FireMonkey-Bitmap unterscheiden sich doch sehr. Dies betrifft insbesondere die Pixelformate. Während das Windows-Bitmap neben dem 24-Bitmap-Format noch weitere Bitmap-Formate zur Verfügung stellt, fehlen die meisten davon unter FireMonkey im Ausgabeformat. Insbesondere für 1-Bit, 4-Bit, 8-Bit, 16-Bit und 32-Bit steht kein Ausgabeformat zur Verfügung, wenn man die Bitmap mit der Endung „.bmp“ speichern möchte. 

Während man im Windows TBitmap die Eigenschaft „Pixelformat“ lesen und schreiben kann, steht es in FireMonkey nur als Lesen-Eigenschaft zur Verfügung. Es existiert zwar eine private „Setpixelformat“-Prozedur in der TBitmap-Klasse, die man zur Not z.B. mit einer Classhelper-Funktion zugänglich machen könnte, aber wahrscheinlich macht das nicht viel Sinn, da intern FireMonkey immer mit einer 32-Bit Bitmap arbeitet.

Wenn man allerdings die Formate verwendet, die typischerweise einen Alphakanal enthalten, also z.B. das Format „PNG“ oder „TIF“, dann werden diese entsprechenden Informationen aus dem Alphakanal auch in diesem Format verwendet und in die Grafikdatei geschrieben.

Wenn man eine 8-Bit Bitmap Datei im BMP-Format lädt und wieder speichert, werden die Farben zwar korrekt in die FireMonkey-Bitmap übernommen, nach dem Speichern der Bitmap-Datei ist es aber eine 32-Bit Bitmap-Datei.

Anders herum gehen leider Informationen verloren, wenn man eine Windows 
32-Bitmap-Datei, die einen Alphakanal hat, in eine FireMonkey-Bitmap lädt. Die Werte des Alphakanals werden dabei nicht übernommen, diese betragen alle 255 (also für vollständig sichtbar). 

Mir ist nicht ganz klar, ob das ein Bug ist.

TBitmapData statt Scanline zur Bitmap-Manipulation
Während man die VCL-Bitmap unter Windows mit der Scanline-Funktion bearbeitet hatte, wird diese unter FireMonkey ab Delphi XE3 durch den TBitmapData Record ersetzt.

Dieser Record sieht wie folgt aus:

Bevor man aber auf die Pixel zugreifen kann, muss man per „MAP“ den Zugriff auf die Bitmap erfragen, wodurch diese je nach Zugriffsart für andere Prozesse gesperrt wird. Dies trägt also zur Thread-Sicherheit der Bitmap-Bearbeitung bei. Ist man mit der Bearbeitung der Bitmap fertig, gibt man sie wieder mit UNMAP frei.

Die Zugriffsart wird durch TMAPAccess bestimmt, was wie folgt definiert ist: 

TMapAccess = (maRead, maWrite, maReadWrite);

Um z.B. ein bestimmtes Pixel in einer Bitmap zu manipulieren, sieht das dann insgesamt wie folgt aus (angenommen, MyBitmap sei eine globale Bitmap-Variable):

Wenn Sie zwischendurch auch noch einen lesenden Zugriff benötigen, müssen Sie 
„maReadWrite“ verwenden. Brauchen Sie nur einen lesenden Zugriff, verwenden Sie „maRead“.

Das Beispiel ist wegen der Anschaulichkeit einfach gehalten, in Ihren eigenen 
Projekten sollten Sie natürlich mit TRY … FINALLY Konstrukten arbeiten, um sicher zu gehen, dass die Sperrung der Bitmap auch im Fehlerfall wieder aufgehoben wird.

Den Alpha-Kanal eines TBitmaps verändern
Wollen Sie nur den Alphawert eines Pixels verändern, müssen Sie einen kleinen Trick anwenden. Sie verwenden hier den TAlphaColorRec, um direkt auf das Byte Zugriff zu erhalten, welches für den Wert des Alphakanals zuständig ist.

Das funktioniert dann so:


Auf den Canvas einer Bitmap zeichnen

Wie von der Windows-Bitmap bekannt, besteht auch für die FireMonkey-Bitmap die Möglichkeit, auf einen Canvas zu zeichnen. Sie können hier etwa „Bitmap.canvas.fillrect“, „Bitmap.canvas.Fillelipse“ usw. verwenden. 

Dazu aber direkt der Hinweis, dass „canvas.textout“ nicht zur Verfügung steht, sondern Sie stattdessen „canvas.Filltext“ verwenden.

Schließlich ist noch eine Besonderheit zu beachten: Sie müssen vor allen Zeichenaktionen auf dem Canvas „Canvas.beginScene“ ausführen und nach Fertigstellung „Canvas.EndScene“.

Das sähe also dann z.B. so aus:

Im aktualisierten eBook finden Sie noch weitergehende Beispiele, wie Sie etwa Bitmaps links oder rechts drehen, horizontal oder vertikal spiegeln, invertieren oder z.B. grau einfärben. Außerdem erhalten Sie Hinweise, wie Sie die einzelnen Einstellattribute und Minimal- bzw. Maximalwerte der zur Verfügung stehenden Filter ermitteln können.

Wenn Sie Anregungen zu Themen haben, lassen Sie es mich gerne wissen. Meine Mailadresse finden Sie oben auf der Seite unter dem Link "Anbieterkennzeichnung & Kontakt". Über meinen Hastasoft-Twitter Account werde ich posten, wenn neue Blogbeiträge zur Verfügung stehen. Wenn Sie wollen, klinken Sie sich dort ein (siehe meine Hastasoft-Seite).

Viel Erfolg mit Delphi und FireMonkey!

Harry Stahl, 01.05.2013