Transparenz und Originalfarbe berechnen
-
Hallo,
ich habe folgendes Problem:
von einer Bibliothek kann ich mir die Ausgabe in ein Bitmap zeichnen lassen.
Jedoch möchte ich, dass die Transparenz erhalten bleibt.
Da dies so nicht möglich ist (die Bibliothek zeichnet alles unbelegte weiß),
habe ich mir folgendes Vorgehen ausgedacht:1. Setze den Hintergrund in der Bibliothek auf eine vordefinierte Farbe A (z.B. Cyan) und zeichne das Bild in ein Bitmap BA.
2. Setze den Hintergrund auf eine andere vordefinierte Farbe B (z.B. Magenta) und zeichne das Bild in ein anderes Bitmap BB.
(Ich habe also nun zwei fast gleiche Bilder, bei dem die nicht bestimmten Bereiche (die transparent sein sollen) jeweils die vordefinierte Farbe annehmen).
3. Vergleiche die beiden Bilder:
a) bei gleichem Pixelwert ist das Ursprungspixel 100% opak und somit bestimmt.
b) bei ungleichem Farbwert, aber den entsprechenden vordefinierten Farben (z.B. Cyan in BA und Magenta in BB) ist das Ursprungspixel 100% transparent und somit auch bestimmt.
c) hier ist mein Problem, wenn das Ursprungspixel einen Transparenzwert zwischen 0% und 100% hat: wie kann ich den ursprünglichen Farbwert + den zugehörigen Transparenzwert berechnen?Mein Vorgehen bis jetzt:
1. Überblendungsfunktion für korrespondierende Farben Cr (letztendliche Farbe in den Bitmaps), Cb (Hintergrundfarbe - also z.B. Cyan bzw. Magenta) und Cf (Originalfarbe, die mit dem Hintergrund vermischt wird) und dem Transparenzwert α:(1 - α) * Cb + α * Cf = Cr
2. Da ich zwei Bilder habe, bei denen Cf und α gleich aber unbekannt sind und Cb bzw. Cr bekannt sind (entsprechend CbA und CbB sowie CrA und CrB für die beiden Bilder), also quasi zwei Funktionen mit 2 Unbekannten, habe ich auf α aufgelöst:
α = 1 - (CrA - CrB)/(CbA - CbB)
3. Berechnen des ursprünglichen Farbwertes anhand des ermittelten Alphawertes und der/den Überblendungsfunktion(en).
Mein Problem hier ist nun, dass ich jede Farbe ja aus einem RGB-Tripel besteht. Die Alpha-Werte, die bei der Berechnung pro Kannal herauskommen stimmen nicht überein.
Also meine Frage: Wo könnte der Fehler sein? (Denkfehler in der Vorgehensweise, oder prinzipiell korrekt?)
Weiß evtl. jemand einen besseren Ansatz?
Bin über jede Anregung/Kritik dankbarMfG
Michael
-
Das Problem ist, wenn du z.B. Magenta als Transparenzfarbe benutzt, kann man Rot nicht mehr trennen. Ist es jetzt das Rot vom Magenta oder original?
Mit Farben, die durch Transparenz ersetzt werden sollen (Color-Keying) erreichst du keine Transparenzstufen - es geht nur ganz oder garnicht.
Die sinnvollste Lösung wäre einfach die Bibliothek dazu zu bewegen, den Alphakanal mit auszugeben, bzw. auf transparenten Untergrund zu rendern.
-
Hallo Blaze,
erstmal Dankeschön für deine schnelle Antwort.
Im Grunde hast du recht - aber ich habe ja die Möglichkeit, mehrere Bilder mit unterschiedlichen Transparenzfarben zu generieren. Das ermöglicht ja, 100% und 0% Transparenz zuverlässig zu erkennen. Die Abstufung ist genau das Problem.Die Bibliothek kann ich leider nicht dazu bewegen, ist nicht quelloffen.
D.h. entweder es geht gar nicht, oder, wie ich hoffe, aus zwei (oder mehreren?) Bildern unterschiedlicher Transparenzfarbe zu Berechnen (ob nun durch meinen obigen Ansatz, oder evtl. einen anderen, besseren).
-
Keine Ahnung, was die Bibliothek kann (du koenntest mal den Namen nennen). Du kannst einfach ein weiteres Bild generieren, dass die Alphainformation im Farbkanal enthaelt. Das zusammenfuegen muss dann extern geschehen. Alternativ: nimm doch eine andere Bibliothek.
-
Bibliothek ist die PDF Library von Datalogics bzw. das Acrobat SDK von Adobe.
An die Alpha-Informationen kann ich leider nicht beim Bild generieren direkt abfragen - die Bibliothek zeichnet einfach das Dokument in ein Bild.
Wie gesagt, ich kann nur den Hintergrund vor dem Zeichnen ändern - und somit Informationen aus den ursprünglichen Transparenzen gewinnen.
Die Frage ist, ob das reicht um die auch Transparenzabstufungen zu gewinnen.Im Prinzip müsste es ja gehen, die tatsächlichen Werte zu berechnen?
Da ja der Wertebereich der Überblendungsfunktion beschränkt ist, ist es wahrscheinlich nicht immer möglich, die exakten Werte zu berechnen, aber ich wäre schon mit einer Heuristik zufrieden.
-
Müsste das nicht gehen, wenn man beim 2. Bild Abstufungen von Weiß bis Schwarz nimmt und dann je nach Helligkeit die Pixel im Originalbild berechnet.
Also im Prinzip sowas:
Wenn S/W Bild Pixel = 0,0,0
Dann Original Bild Pixel = Transparent/Löschen
Wenn S/W Bild Pixel = 255,255,255
Dann Original Bild Pixel = Keine ÄnderungWenn S/WB ild Pixel = 126,126,126
Dann Oirinal Bild Pixel = 50% TransparentHier Gleichungen dazu: http://de.wikipedia.org/wiki/Alpha_Blending
Der Algorithmus dazu sollte ja nicht so schwierig sein zu schreiben.
Edit: Mal ne andere Frage: Du schreibst schon ein Spiel oder? Was für Bibliotheken benutzt du dafür sonst noch?
-
Hallo NaaK,
danke für deine Antwort.
Die Formel habe ich ja im Prinzip schon angewandt.Meine Idee ist jetzt ähnlich deinem Vorschlag:
zuerst nehme ich ein schwarzen Hintergrund
beim 2. Bild dann einen grauen HintergrundBeim ersten Bild sind die Anteile für semitransparente Pixel nur durch die Transparenz selbst verringert (da Hintergrundfarbwert = 0), durch das 2. Bild
müssten sich die Originalwerte dann berechnen lassen.Ich probier das morgen aus und schreib dann wies gelaufen ist.
Ich schreibe leider kein Spiel - sondern ein Tool zur Verarbeitung von PDF-Dateien. Also eigentlich ganz unspektakulär
-
Versuch doch mal das Problem nur fuer den Rot-Kanal zu loesen. Dann wirst du feststellen, warum die Wahl deine urspruengliche Wahl der Hintergrundfarben keinen Sinn macht - sondern schwarz und weiss zu bevorzugen sind. Und da das Ergebnis des Alphablenden eigentlich nur als 16 Bit Zahl genau dargestellt werden kann und du aber nur 8 Bit hast, sollte auch klar sein, das dein Ergebnis nicht sehr genau sein kann. f'`8k
AutocogitoGruß, TGGC (Was Gamestar sagt...)