Transparenz wird magenta

Lyras

Mitglied
Hallo, ihr da draußen.

Früher ( bzw. partiell noch heutzutage ) ist/war es ja gang und gäbe, dass man auf Tilesets oder einzelnen Texturen alle Pixel, die am Ende transparent sein sollten mit magenta ( Farbcode: 0xff00ff ) eingefärbt
show.php
und diese am Ende rausgefiltert hat. Ich erstelle also gerade ein 2D-Spiel, das schon etwas größer sein sollte, weshalb die Einfärb-Methode vlt. nicht das beste/gängigste ist. Ich habe mich für meinen Code etwas an "Prelude of the Chambered (Ludum Dare 21)", unter anderem, was das Rendering-System anbelangt. Er hat also bei seinem Code ( welcher wohlgemerkt schon etwas älter ist ) auch diese oben beschriebene Einfärb-Methode genutzt. Da ich dies aber nicht haben will, versuche ich anstatt alle Pixel erst anzumalen, diese direkt transparent zu lassen.

Ich habe also eine "Test-PNG", welche einen Schriftzug und einen transparent Hintergrund enthält.


Wie man sehen kann, wird der Hintergrund geladen ( das Hellblaue ) und auch die Textur. Obwohl
die Textur transparent ist und BufferedImage.getRGB( x , y ) TYPE_INT_ARGB als Standard-Color-Model besitzt, werden die eigentlich transparenten Pixel magenta dargestellt.

Nebensache: Sobald ich in der Main den Typ des BufferedImages, das auf den Canvas geladen wird von TYPE_INT_RGB auf TYPE_INT_ARGB umstelle kommt das hier raus:


Jetzt wird zwar die Transparenz meines Bildes übernommen, aber der Hintergrund ist nun grau.

Wie kann ich das ganze nun lösen?
Danke schonmal im Voraus!

MFG ~Lyras
 
Ich kann dir gerade leider nicht direkt weiterhelfen, da ich mir das erstmal genauer anschauen müsste, dazu bin ich gerade aber ein wenig zu viel im Stress.
Eine Frage habe ich dennoch, benötigst du denn überhaupt die Transparenz ?
Wenn du nur mit AWT oder Swing arbeitest, dann solltest du dir das ganze mit der Transparenz nochmal durch den Kopf gehen lassen da die Performance dadurch (ne nach Anwendung) ziemlich beeinträchtigt werden kann.
Ich muss sagen die Pink-zu-Transparent Methode ist blei "kleineren" games immer noch üblich, zumindest keine Engine dahinter steckt oder du anfängst mir OpenGL-Bindings rumzuspielen.

mfg Major
 
Die Transparenz ist nicht unbedingt wichtig, aber sie ist angenehmer als das Einfärben. Desweiteren kann man das Magenta noch zum Texturieren nutzen.

Aber die Sache, die mich am meisten verwundert ist, warum durch TYPE_INT_ARGB der Hintergrund grau dargestellt wird.
 
EDIT (gelöst):
Okay...

Meine 2 Fehler:
1. Ich habe zwar TYPE_INT_ARGB eingestellt, aber habe die Pixel vom Hintergrund nur mit der Farbe '0x00FF00' [RRGGBB] eingefärbt. Stattdessen müsste es heißen '0xFF00FF00' [AARRGGBB], damit der Hintergrund vollkommen undurchsichtig ist. Das grau rührte nämlich da her, dass die Farbe komplett durchsichtig war und daher anscheinend durch das Fenster o. Ä. (genauer Grund mir nicht bekannt) die graue Farbe "durchschien". Die Farbe war also transparent und der Hintergrund gräulich-schwarz

2. Ich habe zwar schon häufig probiert, die durch ImageIO.read() magenta eingefärbten, eigentlich transparenten Pixel durch die Pixelfarbe an der neuen Position zu ersetzen, jedoch an den falschen Codestellen.
Ich habe nun also einen Standard-Hintergrund, der nun, durch das Lösen des ersten Problems richtig gerendert wurde, gemalt und, sobald der Pixel der neu zu ladenden Bitmap transparent war, einfach die Farbe des Hintergrundpixels an der jeweiligen Pixelposition übergeben.

Ich hoffe, dass das jetzt verständlich war und anderen mit der Lösung dieser Probleme soweit geholfen ist, dass sie nicht in die selben Fallen tappen. Desweiteren sind natürlich Korrekturen gewünscht, falls diese notwendig sind, damit der erwünschte Lerneffekt nicht durch gefährliches Halbwissen oder gar Falschaussagen wegbleibt.

MFG ~Lyras
 

Zurück
Oben