Transparente Pixel berechnen
Übersicht

![]() |
Der EisvogelBetreff: Transparente Pixel berechnen |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo
Ich habe derzeit das Problem, dass ich 2 Pixmaps habe, die ich übereinander legen will, dafür verwenden ich 2 For-Next-Schleifen, die jeweils Read- und WritePixel aufrufen. Jetzt das Problem: Wenn der Pixel des darüberzulegenden Pixmaps Teil-Transparent ist, oder auch komplett Transparent ist, dann wird es dennoch im unteren Pixmap übermalt, und ich erhalte zum Schluss nur das obere Pixmap. Also muss ich die Pixeldaten des unteren und oberen Pixmaps irgendwie zusammenrechnen im Bezug auf die Transparenz, dabei sollte allerdings auch die Quantität des Alpha-Channels bewahrst werden, was heißt dass wenn ich 2 mal 50% Transparenz habe, dass es trotzdem zum Schluss noch Tranzparent ist. Ich habe aber leider keinerlei Ansatz, wie ich die Pixel-Daten zusammenrechnen kann. Weiß jemand von euch wie das geht, oder kann mir eine Erklärung im Internet zeigen? MfG Der Eisvogel |
||
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB Projekte: Window-Crasher Ich liebe es mit der WinAPI zu spielen. |
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
für A R G B gilt:
(A1 +a2)/2 = benötigter Wert. |
||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
![]() |
Der Eisvogel |
![]() Antworten mit Zitat ![]() |
---|---|---|
Danke, aber das versteh ich nicht ganz. Meinst du damit folgendes:
Code: [AUSKLAPPEN] (A1 +a2)/2 = NewA
(R1 +r2)/2 = NewR (G1 +g2)/2 = NewG (B1 +b2)/2 = NewB Dann wäre es immer nur 50% Alpha. Ich bin zu doof das richtig zu interpretieren. Sorry. |
||
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB Projekte: Window-Crasher Ich liebe es mit der WinAPI zu spielen. |
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Das ist einfach der Mittelwert jeder Komponente... Taschenrechner oder ausprobieren zeigt dir ja, was dabei raus kommt. | ||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
Der Eisvogel |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ja, das meine ich ja, es ist immer der Mittelwert, aber was wenn ich 10%, 20% oder 30% Alpha habe? Das muss doch irgendwie im Bezug auf den Alpha-Channel berechnet werden, oder?
EDIT: Und wenn der Alpha-Channel des oberen Pixmaps 0 ist, dann bleibt der Alpha-Channel des unteren gleich, und wird nicht kleiner, aber das kann ja so nicht funktionieren. |
||
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB Projekte: Window-Crasher Ich liebe es mit der WinAPI zu spielen. |
![]() |
mpmxyz |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich beziehe mich jetzt auf Alphawerte von 0 bis 1:
Um die Formeln zu erhalten, sollte man sich vorstellen, wie die Farbe der Hintergrundpixel mit den Bildern kombiniert wird. Die Hintergrundfarbe sei H. Die Durchlässigkeit eines Pixels entspricht 1-Alpha des Pixels. H wird zuerst zusammen mit dem unteren Bild, dem Bild 1, vermischt: Code: [AUSKLAPPEN] Zwischenergebnis=H*(1-Alpha1)+Farbe1*Alpha1
Nun wird diese Farbe mit dem zweiten Bild kombiniert: Code: [AUSKLAPPEN] Endergebnis=(H*(1-Alpha1)+Farbe1*Alpha1)*(1-Alpha2)+Farbe2*Alpha2
=H*(1-Alpha1)*(1-Alpha2)+Farbe1*Alpha1*(1-Alpha2)+Farbe2*Alpha2 =H*(1-Alpha1)*(1-Alpha2)+(1-(1-Alpha1)*(1-Alpha2))*[(Farbe1*Alpha1*(1-Alpha2)+Farbe2*Alpha2)/(1-(1-Alpha1)*(1-Alpha2))] Aus dieser Gleichung lassen sich die Formeln für die Farbe und den Alphawert der Kombination entnehmen: Code: [AUSKLAPPEN] Alpha=(1-(1-Alpha1)*(1-Alpha2))
Farbe=(Farbe1*Alpha1*(1-Alpha2)+Farbe2*Alpha2)/(1-(1-Alpha1)*(1-Alpha2)) Achtung: Wenn Alpha 0 ist, lässt sich durch die Division durch 0 kein eindeutiger Wert für die Farbe bestimmen! Man kann ihn hier stattdessen frei wählen. Die richtige Lösung ist also etwas komplizierter als ein einfacher Mittelwert. ![]() mfG mpmxyz Edit: Bei meinem Ansatz geht es darum, dass das nacheinander abfolgende Zeichnen der zwei Pixmaps durch das Zeichnen einer Pixmap ersetzt wird. |
||
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer |
- Zuletzt bearbeitet von mpmxyz am Fr, Nov 26, 2010 22:55, insgesamt einmal bearbeitet
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
"nicht funktionieren" ist hier - wie immer - keine gute Beschreibung.
Möchtest du den kleineren oder den größeren Alphawert? Dann benutzte die Funktionen Min bzw. Max. Kommt halt darauf an, was für ein Ergebnis dir vorschwebt. |
||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
Der Eisvogel |
![]() Antworten mit Zitat ![]() |
---|---|---|
Mir schwebt das vor, was durch DrawImage img1 und DrawImage img2 gemalt werden würde. Nur das ich es in den Pixmaps direkt brache, also muss ich es selber berechnen.
@mpmxyz: Danke, dass schaut schonmal kompliziert aus, so wie ich es mir vorgestellt hatte, aber irgendetwas geht immernoch schief. Die Stellen, an den das obere Pixmap nicht tranzparent ist, werden jetzt einfach Schwarz dargestellt. Hier mein Berechnungs-Code: BlitzMax: [AUSKLAPPEN] Local argb1:Int = ReadPixel(dst, x, y) |
||
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB Projekte: Window-Crasher Ich liebe es mit der WinAPI zu spielen. |
![]() |
mpmxyz |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hast du meine Aussage über den Wertebereich der Alphas beachtet?
Ich ging von Gleitkommazahlen mit einem Wert von 0 bis 1 aus. (Teile die Alphawerte durch 255.0!) mfG mpmxyz |
||
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer |
![]() |
Der Eisvogel |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ah, Sorry. Habs auch grad gesehen. Ich habe andere Stellen in meinem Code, wo Alpha schon von 0-1 ist. Hab vergessen, dass es hier noch nicht der Fall war.
Vielen Dank mpmxyz, jetzt funktioniert es perfekt. Ich habe mein Ziel erreicht. DANKE! MfG Der Eisvogel |
||
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB Projekte: Window-Crasher Ich liebe es mit der WinAPI zu spielen. |
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Solange alpha mit einer Werteskala von 0-255 gespeichert ist (wie in Pixmaps ja so üblich) ist die Mittelwerttbildung wohl der einfache und richtige Ansatz.
Hast Du ein Bild mit 30 Alpha und eines mit 190 und addierst die beiden Pixel an dieser Stelle hat das Ergebnis eine Transparenz von (30+190) / 2 , also 110, was absolut korrekt ist. Anders sieht es nur aus wenn man eben nicht eine Gesamttransparenz erhalten will sondern die Farbwerte entsprechend der Transparenz addieren möchte. Dann sollte aber auch die Beschreibung aussagekräftiger sein ![]() |
||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
![]() |
Der Eisvogel |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich hatte doch eigentlich gesagt, dass ich ein Pixmap über das andere Legen wollte. Sorry wenn das nicht richtig rüberkam, aber ich hab ja jetzt meine Lösung. Danke.
MfG Der Eisvogel |
||
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB Projekte: Window-Crasher Ich liebe es mit der WinAPI zu spielen. |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group