Java2D Transparenz geht bei einfärben verloren

conehead

Mitglied
Moin.
Hoffe ihr könnt mir wieder mal helfen.

Erst einmal kurz mein vorhaben:
Ich wollte mich etwas mit Java2D auseinandersetzen.
Dazu habe ich eine einfache, kleine Particleengine geschrieben.

Ich habe einen Punkt, aus dem viele Sterne kommen sollen und diese sollen ein Stück weit fliegen und sich dann langsam auflösen (und dabei die Farbe ändern). Als Particle soll ein einfaches 32-Bit PNG genommen werden.
Es ist ein weißer Stern auf transparentem Hintergrund.
Wenn ich das ganze komplett ohne Farbe zeichnen lasse, funktioniert es ganz gut, wie man auf dem schwarz/weiß Bild sehen kann, sind die Sterne transparent.
Sobald ich aber Farbe hinzufüge, wird das gesamte 32x32px Bild eingefärbt und nicht nur der Stern, wie ich es gerne hätte.
Also kann es ja eigentlich nicht am Bild selbst liegen?!

Naja einfach nur mal ein wenig Quelltext, wie ich das Bild lade und zeichne:

Java:
//Farbangaben inc. Alphawert
public Color beginColor = new Color(0,255, 210,255);
public Color endColor = new Color(255, 246, 0,0);
//Laden des Bildes
ImageIcon i = new ImageIcon("star.png");
Image texture = i.getImage();
//Ausgeben des Bildes ohne Farbe (Bild1)
g2d.drawImage(texture, (int) particleList.get(i).position.x,(int) particleList.get(i).position.y, null);
//Ausgeben des Bildes mit Farbe (Bild2)
g2d.drawImage(texture, (int) particleList.get(i).position.x,(int) particleList.get(i).position.y, particleList.get(i).color, null);

Das sollten eigentlich schon alle relevanten Stellen sein.
Ich habe schon etwas mit setComposite rumgespielt, jedoch mit genau dem selben Ergebnis.

Vielleicht ist es ja ganz einfach?
Hoffe ihr habt ein paar Tipps für mich!
Danke schonmal!

MfG

conehead
 

Anhänge

  • star.png
    star.png
    3,5 KB · Aufrufe: 40
  • 1.jpg
    1.jpg
    70,4 KB · Aufrufe: 26
  • 2.jpg
    2.jpg
    84,3 KB · Aufrufe: 27
Steht der Code so bei Dir in der paintComponent?

So geht es schon mal nicht ;-) siehe Kommentar zur Methode:
API Doku hat gesagt.:
public abstract boolean drawImage(Image img,
int x,
int y,
int width,
int height,
Color bgcolor,
ImageObserver observer)

Draws as much of the specified image as has already been scaled to fit inside the specified rectangle.

The image is drawn inside the specified rectangle of this graphics context's coordinate space, and is scaled if necessary. Transparent pixels are drawn in the specified background color. This operation is equivalent to filling a rectangle of the width and height of the specified image with the given color and then drawing the image on top of it, but possibly more efficient...
Musste eigentlich mit Hilfe von AlphaComposite möglich sein. Erst die Sterne zeichnen und dann ein farbiges Rechteck mit passendem AlphaComposite (müsste da erst mal nachschauen) über den "Sternenhaufen" malen. Das geht allerdings nicht direkt auf die Komponenten, sondern nur mit einem ARGB BufferedImage.
 
Nein, natürlich ist es nicht alles beieinander, sondern an 2 Stellen im Quellcode.

Einmal der Initialisierung und dann halt eine eigene Paint-Methode.

Dann muss ich mir das noch einmal genauer anschauen mit dem ARGB BufferedImage.
Vielleicht ist es ja wirklich die Lösung, denn anschließend drüberzeichnen habe ich noch nicht ausprobiert.


Ich werds mal testen, eventuell hat ja jemand solange noch weitere Tipps für mich.

//Achja, da fällt mir gerade ein:
Wenn ich den Stern erst zeichnen lasse, dann kann ich ihm ja nachträglich auch keine Transparenz hinzufügen, oder? Also müsste ich ihn auch das erste mal mit getComposite zeichnen lassen und somit beispielsweise die 255 aus der Color in 1.0f umwandeln?

Oder habe ich da einen Denkfehler?
 
Das png ist ja transparent.
Dieses einfach an die gewünschten Positionen auf ein transparentes Image(ARGB BufferedImage) zeichnen. Dann ein AlphaComposite auf dessen Graphics Objekt setzen (könnte SRC_IN sein) und damit das farbige Rechteck auf des Image zeichnen.
In der paint... dann das Image zeichnen.
 
Ah vielen Dank!
Genau das was ich gesucht habe.

Hab ich wohl leider nach den falschen Begriffen gesucht :/

Deine Funktion färbt das Bild genau so ein, wie ich es wollte.
Jedoch fehlt dort ja noch die Transparenz an sich.
Diese habe ich dann so nachträglich hinzugefügt:

Java:
g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, (float) particleList.get(i).color.getAlpha()/255));
        	g2d.drawImage(colorizeImage(tex,particleList.get(i).color), (int) particleList.get(i).position.x,(int) particleList.get(i).position.y, null);

Aber jetzt funktioniert es so, wie es funktionieren soll.
Nur dass man beim Einfärben+Transparenz schon ganz gut Slowdowns bemerken kann, aber das ist wohl ein anderes Thema.

Danke nochmal!
 

Anhänge

  • 3.jpg
    3.jpg
    60 KB · Aufrufe: 28
Hmja, das Einfärben bei jedem Zeichnen zu machen war auch eigentlich nicht Sinn der Sache... (Selbst die "Brute-force"-Variante, einen Satz von Bildern mit verschiedenen Farben in einer Map oder so zu speichern, wäre in diesem Fall sinnvoller...)
 
Hmm...da muss ich mir wohl noch was einfallen lassen.
Aber ich möchte alle Farben ja extra nicht vorher speichern müssen.

Es geht ja darum, dass die Farbe weich ändern soll.
Das wären ja tausende von Farben, die ich vorher speichern müsste.
 

Neue Themen


Zurück
Oben