Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Alphablending gegen transparenten Hintergrund (https://www.delphipraxis.net/151405-alphablending-gegen-transparenten-hintergrund.html)

Namenloser 16. Mai 2010 21:51


Alphablending gegen transparenten Hintergrund
 
Hallo,

ich möchte gerne auf ein leeres, transparentes Bitmap eine alphatransparente Farbe zeichnen. Der übliche Ansatz, den man auch überall im Internet findet ist folgender:
Delphi-Quellcode:
Ergebnis = Hintergrund * (1.0 - Alpha) + Vordergrund * Alpha;
Leider versagt dieser Ansatz jedoch, wenn der Hintergrund nicht opak ist.

Beispiel:
(Der Einfachkeit halber werde ich hier mal von einem Graustufenbild mit Alphakanal ausgehen)
Der Hintergrund ist "leer": [Farbe: 0.0; Alpha: 0.0].
Darauf wird jetzt 50%iges Weiß gezeichnet: [Farbe: 1.0; Alpha: 0.5].

Das erwartete/erwünschte Ergebnis wäre also ebenfalls 50%iges Weiß [Farbe: 1.0; Alpha: 0.5].

Nimmt man aber nun die obige Formel, kommt etwas anderes heraus:
Delphi-Quellcode:
Farbe = 0.0 * (1.0 - 0.5) + 1.0 * 0.5 = 0.5
Alpha = 0.0 * (1.0 - 0.5) + 1.0 * 0.5 = 0.5
Das Ergebnis ist also [Farbe: 0.5; Alpha: 0.5].

Die Ursache ist offensichtlich, dass in der Rechnung der Alphawert des Hintergrundes nicht berücksichtigt wird. Leider stehe ich aber irgendwie auf dem Schlauch und komme auf keine Formel, die auch mit transparenten Hintergründen klarkommt.

Ich hoffe meine Erklärung war verständlich. Um es noch mal zu veranschaulichen: Ich möchte gerne so ein Verhalten wie bei den Layern in Photoshop und ähnlichen Bildbearbeitungsprogrammen.

Hat jemand eine Idee, wie man das erzielt? :gruebel:

Vielen Dank schonmal.

Namenloser 16. Mai 2010 22:07

Re: Alphablending gegen transparenten Hintergrund
 
Ah, na typisch, kaum erstellt man das Topic, findet man doch noch was - ich glaube, ich habe jetzt gefunden was ich suche.
Zitat:

Code:
X.a = M.a + N.a * (1 - M.a)
X.r = (M.r * M.a + N.r * N.a * (1 - M.a)) / X.a

Mal schauen, ob das funktioniert.

SirThornberry 17. Mai 2010 07:09

Re: Alphablending gegen transparenten Hintergrund
 
wenn man wüsste womit du arbeitest hätte man dir auch einen Tipp geben können. Wenn du mit "1 - Alpha" arbeitest deutet es darauf hinn das 1 bei dir das maximum ist. Wenn du jedoch mit Bitmaps arbeitest so steckt hinter dem Alphawert ein Wert bis 255.

Namenloser 17. Mai 2010 12:52

Re: Alphablending gegen transparenten Hintergrund
 
Ich habe hier der Einfachkeit halber einen Wertebereich von 0-1 genommen. Damit spart man sich das Dividieren und Multiplizieren mit 255 an diversen Stellen.

Medium 17. Mai 2010 13:27

Re: Alphablending gegen transparenten Hintergrund
 
0..1 ist auch der Standard bei Farben, die 0..255 sind ein Spezialfall der 24Bit RGB (bzw. genereller aller Formate die in Bytes denken). Allgemeine Formeln drückt man immer in 0..1 aus.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:10 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz