BufferedImage transparent löschen

agentone

Bekanntes Mitglied
Hi,
ich habe ein Spiel mit mehreren Layern programmiert. Also mehreren Bildebenen, die in einer bestimmten Reihenfolge übereinander gelegt werden.
Dazu verwende ich
Java:
BufferedImage bimg=new BufferedImage(Constants.WIDTH,Constants.HEIGHT,BufferedImage.TYPE_INT_ARGB);
Wenn ich allerdings bei jedem Zeichenvorgang die BufferedImages neu erstelle, wird das Spiel zu langsam. Wenn ich das BufferedImage nur einmal erstelle und immer nur mit fillRect die Graphics "zurücksetze", wird das BufferedImage ja nie mehr transparent!

Ich brauche also eine Möglichkeit, mit der ich ein Bild, in welches bereits gezeichnet wurde, wieder vollständig transparent machen kann. Danke schon mal...
 

Steev

Bekanntes Mitglied
Hi agentone,

ich würde mir das Graphics-Objekt deines Bildes nehmen und dann mithilfe der Methode clear-Rect die Zeichfläche wieder löschen.

Gruß
Steev

[EDIT:]@Marco: Nein, das sollte eigendlich nicht funktionieren, weil dann einfach nur ein transparentes Rechteck über alles gezeichnet wird. Es müsste rein gar nichts passieren...
 
Zuletzt bearbeitet:

agentone

Bekanntes Mitglied
Nein,
clearRect und fillRect habe ich schon mit transparenten Farben ausprobiert. Da passiert nichts, wie du selber geschrieben hast...
und wenn ich erst setColor(Color.BLACK) und dann fillRect(), dann wird das Bild ja bloß schwarz, aber nicht transparent!
 

Steev

Bekanntes Mitglied
@Schandro:
Das sollte funktionieren, ich hatte vergessen, dass mit clearRect nur die Hintergrundfarbe wieder zurückgesetzt wird. Was man vieleicht noch ausprobieren kann ist die Hintergrundfarbe auf Transparent zu setzen, dann sollte clearRect auch funktionieren (k.A. habe es nicht ausprobiert... :) ).

Code:
img.getRaster().setPixels(x, y, width, height, new double[] {0, 0, 0, 0}); // new double ist unschön ;-)
 

Marco13

Top Contributor
[EDIT:]@Marco: Nein, das sollte eigendlich nicht funktionieren, weil dann einfach nur ein transparentes Rechteck über alles gezeichnet wird. Es müsste rein gar nichts passieren...

Najaaaa... man muss (natürlich :cool: ;) :oops: ) ... das richtige Composite setzen, bevor man das Rechteck malt...
Java:
import java.awt.image.*;
import java.awt.*;

class TransparentPaintTest
{
    public static void main(String args[])
    {
        BufferedImage image = new BufferedImage(10,10, BufferedImage.TYPE_INT_ARGB);
        Graphics2D g = image.createGraphics();

        g.setColor(Color.RED);
        g.fillRect(0,0,10,10);
        System.out.println(Integer.toHexString(image.getRGB(0,0)));


        g.setComposite(AlphaComposite.Src); //------------------------- Composite setzen...
        g.setColor(new Color(0,0,0,0));
        g.fillRect(0,0,10,10);
        System.out.println(Integer.toHexString(image.getRGB(0,0)));

        g.dispose();
    }
}
 

agentone

Bekanntes Mitglied
Sorry, dass ich erst so spät geantwortet habe.

@Marco13: Vielen Dank! Dein Beispiel-Programm funktioniert und ich konnte es auch in mein Programm umsetzen.

@Steev: Deine Idee war zwar gut, aber ich habe diesen Fehler bekommen:

Exception in thread "Thread-6" java.lang.ArrayIndexOutOfBoundsException: 4
at java.awt.image.SinglePixelPackedSampleModel.setPixels(SinglePixelPackedSampleModel.java:671)
at java.awt.image.WritableRaster.setPixels(WritableRaster.java:550)
at sun.awt.image.SunWritableRaster.setPixels(SunWritableRaster.java:176)
at GamePanel.drawBuffer(GamePanel.java:199)
at GamePanel.run(GamePanel.java:72)
at java.lang.Thread.run(Thread.java:619)
 

Steev

Bekanntes Mitglied
Hi agentone,

ich nehme mal an, dass entweder die X- oder die Y-Position in Verbindung mit der Breite oder Höhe zu einer Exception führen.
Guck doch bitte mal, an welcher Position in den beiden Klassen er stehen bleibt (Debugen) hier müsste ein Array mithilfe ins Index ausgelesen werden. Wenn du im Debuger die Variablenwerte anguckst, dann müsstest du eigendlich relativ schnell dahinter kommen, welcher Wert falsch ist.

Oder hast du als Farbe vieleicht einen Array mit der Länge 3 anstatt 4 angegeben?

Gruß
Steev
 

agentone

Bekanntes Mitglied
Hi Steev,
1. x,y,Breite und Höhe liegen zusammen nicht über der Image-Größe.
2. Das Array hat die Länge 4.
3. "at GamePanel.drawBuffer(GamePanel.java:199)" ist bimg.getRaster().setPixels(10, 10, 80, 80, new int[]{0, 0, 0, 0});
Das BufferedImage wurde konstruiert durch new BufferedImage(100, 100, BufferedImage.TYPE_INT_ARGB);
 

Steev

Bekanntes Mitglied
Hi Steev,
1. x,y,Breite und Höhe liegen zusammen nicht über der Image-Größe.
2. Das Array hat die Länge 4.
3. "at GamePanel.drawBuffer(GamePanel.java:199)" ist bimg.getRaster().setPixels(10, 10, 80, 80, new int[]{0, 0, 0, 0});
Das BufferedImage wurde konstruiert durch new BufferedImage(100, 100, BufferedImage.TYPE_INT_ARGB);

Hmm, dass ist jetzt schwer zu sagen, wo da der Fehler liegt. Der Code sieht soweit eigendlich in Ordnung aus. (Er hat bei mir ja auch funktioniert ;-) )

> new int[]{0, 0, 0, 0}

Das war eigendlich nur als Beispiel gedacht. Normalerweise solltest du dir hier eine Konstante anlegen und diese Verwenden, damit du nicht pro Renderung einen neuen Array erzeugst.
 

Marco13

Top Contributor
Ähm... *räusper*.... ???:L bei
setPixels(10, 10, 80, 80, new int[]{0, 0, 0, 0});
versucht er doch, ein 80x80 großes Stück des Bildes zu füllen - und die Daten dafür aus einen Array mit 4 Elementen zu holen... oder?
setPixels(10, 10, 80, 80, new int[80*80]);
könnte gehen....
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B BufferedImage Position Spiele- und Multimedia-Programmierung 8
B BufferStrategy zu BufferedImage? Irgendwie? Spiele- und Multimedia-Programmierung 2
D getsubimage aus BufferedImage und Rueckwandlung in ein ImagePlus bild Spiele- und Multimedia-Programmierung 0
V BufferedImage[] aus anderer Classe auslesen Spiele- und Multimedia-Programmierung 2
F [JMyron] Bild von int[] zu BufferedImage Spiele- und Multimedia-Programmierung 2
Q BufferedImage vs. Heap Space ‒ Warum wird der Speicher nicht freigegeben? Spiele- und Multimedia-Programmierung 6
M Performance Problem bei BufferedImage Spiele- und Multimedia-Programmierung 7
R BufferedImage > Integer.MAX_VALUE Spiele- und Multimedia-Programmierung 9
M Pixel eines BufferedImage bearbeiten (Performance) Spiele- und Multimedia-Programmierung 23
G BufferedImage -> Farbe wechselt willkürlich Spiele- und Multimedia-Programmierung 15
P int-Array zu BufferedImage (performance?) Spiele- und Multimedia-Programmierung 14
radiac Stringtext mit BufferedImage Textur. Spiele- und Multimedia-Programmierung 6
kowa BufferedImage und Antialias Spiele- und Multimedia-Programmierung 2
T BufferedImage#setRGB #getRGB zu langsam Spiele- und Multimedia-Programmierung 4
J Zeichnen in BufferedImage und dieses in Datei speichern Spiele- und Multimedia-Programmierung 2
A Image in BufferedImage konvertieren Spiele- und Multimedia-Programmierung 2
Z Transparenz in BufferedImage Spiele- und Multimedia-Programmierung 8
Z JME - Rendering in BufferedImage Spiele- und Multimedia-Programmierung 14
A Bildbereich als BufferedImage Spiele- und Multimedia-Programmierung 3
M BufferedImage blass machen Spiele- und Multimedia-Programmierung 5
Lulumann6 BufferedImage in VolatileImage casten Spiele- und Multimedia-Programmierung 10
F BufferedImage verursacht OutOfMemoryError Spiele- und Multimedia-Programmierung 11
P Rotation von BufferedImage (Affine Transformation) Spiele- und Multimedia-Programmierung 7
S Image to BufferedImage Spiele- und Multimedia-Programmierung 3
B LWJGL Manche Seiten werden transparent angezeigt Spiele- und Multimedia-Programmierung 2
J Bestimmte Pixel transparent erscheinen lassen Spiele- und Multimedia-Programmierung 5
Devil0s Magenta zu transparent | Spritesheet Spiele- und Multimedia-Programmierung 2
J JTable transparent Spiele- und Multimedia-Programmierung 2
I weiß = transparent Spiele- und Multimedia-Programmierung 2
F Spigot 1.14 Minecraft Welt file löschen Spiele- und Multimedia-Programmierung 6
C ***** bitte thread löschen *** Spiele- und Multimedia-Programmierung 3
X Polygon in Graphics2D löschen Spiele- und Multimedia-Programmierung 4
G Bereich im Image löschen Spiele- und Multimedia-Programmierung 4

Ähnliche Java Themen

Neue Themen


Oben