AlphaImages - 'ohne Fransenränder'
Januar 2004 by Michael Brempel
Email | Homepage


Einleitung
In diesem kleinen Tutorial möchte ich versuchen zu erklären, wie man das immer wieder auftretende Problem der Fransenränder bei Bildern mit Alphakanal vermeidet.
obere Abbildung: oben jeweils das Bild ohne Alphaverrechnung, unten incl Alphaverrechnung
- links: grüner Rand durch falsche Hintergrundfarbe (bgcolor=grün, non-premultiplication)
- mitte: richtiger Rand (bgcolor=schwarz, non-premultiplication)
- rechts: dunkler Rand durch premultipikation (bgcolor=schwarz, premultiplication)


AlphaImages - 'ohne Fransenränder'

Bilder mit Alphakanal sind heutzutage in der Spieleentwicklung sowie in anderen Multimadiabereichen unabdingbar. Diese Bilder müssen jedoch richtig erstellt werden, um beim Compositing oder im Computerspiel keine unsauberen Ränder zu hinterlassen.

AlphaImages aus 3D-Programmen
Kommen die Bilder direkt vom Renderer eines 3D-Programmes so ist das meist kein Problem, solange man die richtigen Einstellungen beim Abspeichern verwendet. In unserem Beispiel möchten wir einen Cursor für ein 2D-Computerspiel erzeugen. Ein Format, das Alphakanal unterstützt, ist das TargaBitmap bzw 'tga'-Format. Beim Speichern werden uns einige Optionen des Formates angegeben. Interessant ist hier die Einstellung 'pre-multiplied alpha'. Diesen müssen wir ausgeschaltet lassen, da wir ansonsten einen je nach Hintergrund farbigen Rand erhalten. Bei 'non-premultiplied alpha' wird der Hintergrund mit den Farbwerten des davorigen Objektes verrechnet. Deshalb ist es wichtig, dass der Renderhintergrund schwarz (rgb(0,0,0)) ist! Hier wird die eigentliche Farbe des Objektes nicht durch die Hintergrundfarbe verfälscht(siehe linke Abbildung). Haben wir diese Dinge beachtet bekommen wir ein sauberes Alphabild.

AlphaImages aus 2D-Programmen
Etwas komplizierter sieht es aus, wenn wir den Cursor in einem 2D-Programm zeichnen. Standardmäßig verwenden einige Exporter den Premultiplied-Modus, der sich auch nicht abschalten lässt. Um dennoch ein korrektes Ergebnis zu erzielen kann man wie folgt vorgehen(beispielhaft bei CorelPhotopaint9):
Beim Beginn nicht auf den Hintergrund sondern auf eine leere neue Ebene zeichnen. Nachdem der Cursor fertiggezeichnet ist duplizieren wir die Ebene, erzeugen sozusagen eine Sicherheitskopie der Ebenen-Transparenzmaske(unserer späteren Alphamaske). Als nächstes bearbeiten wir die Transparenzmaske(die Maske bekommen wir über Maske->aus Objekt erstellen) unserer vorherigen Ebene, indem wir alle Werte, die nicht schwarz sprich teiltransparent sind auf weiß(nicht transparent) setzen. Hierfür gibt es in Corel9 die Funktion Objekt->Randpixel->Grenzwert, dessen Wert wir auf 1 setzen. (Ein anderer Weg wäre direkt die Maske zu bearbeiten: zB Maske aus Objekt erstellen; den aktuellen Maskenkanal im Rollout Kanäle auswählen; unter Bild ändern->Grenzwert die nicht-schwarzen Werte nach weiß verschieben). Die Ebene enthält nun nur noch 100% oder 0% transparente Bereiche (siehe Abbildungen links unten). Diese Ebene reduzieren wir auf den Hintergrund und erstellen unsere alte Transparenzmaske aus unserem Objektduplikat(Maske aus Objekt erstellen), dass wir danach löschen können. Wenn wir das Bild nun im tga-Format speichern erhalten wir ein sauberes Alpha-Bild, dass an den Rändern immer korrekt mit jedem beliebigen Hintergrund verrechnet wird.



Allgemein für 3D-Renderings:
- Renderhintergrund rgb(0,0,0) verwenden
- als non-premultiplied-Alpha TargaBitmap abspeichern

Allgemein für 2D-AlphaBitmaps:
- generell immer auf neue Ebene zeichnen
- Transparenzmaske über Ebenenkopie sichern
- alle teiltransparenten Bereiche auf der Ebene in nicht transparente umwandeln (Transparenzmaske bearbeiten)
- Maske aus 'Sicherungsebene' wiederherstellen

Viel Spass weiterhin...
Michael 'Mechiil' Brempel