Schreiben und Laden von Files

jorgeHX

Erfahrenes Mitglied
Hallo,

ich bin auf ein doofes Problem gestoßen, bei dem ich etwas Hilfe gebrauchen könnte.
In meinem kleinem Malprogramm arbeite ich mit BufferedImages, die sehr oft verändert werden.

Dabei nutze ich immer ein BufferedImage, das den aktuellen Malprozess beinhaltet und ein BufferedImage, das quasi den zuletzt davor gültigen Malstand beschreibt.

Da ich immer erst das alte BufferedImage auslese und es nicht einem anderen Image zuweisen kann, da es ja sonst eine Referenz wäre, muss ich es andauernd abspeichern und wieder laden. Das ganze sieht wie folgt aus

Code:
BufferedImage img;
...
     try {
        ImageIO.write(grCanvas.getDisplayedImage(), "jpeg",
                      new File("Icons/uebungIcons/BufferedImage.jpg"));
        img = ImageIO.read(new File("Icons/uebungIcons/BufferedImage.jpg"));
      }
      catch (IOException ee) {
        // TODO Auto-generated catch block
        ee.printStackTrace();
      }
...

Natürlich frisst das super viel Speicher, so dass mein Heap kontinuierlich wächst.

Meine Fragen wären:
Kann ich das BufferedImage aus grCanvas.getDisplayedImage() irgendwie kopieren und in einem anderen BufferedImage abspeichern ohne dass eine Referenz besteht

Oder gibt es eine bessere Möglichkeit, um Files zu schreiben oder auszulesen?

Es wäre super wenn ihr helfen könntet,
danke
 
Du kannst für die Zuweisung die Funktion clone()(speicherImage = dasImage.clone()) aufrufen die erstellt eine Kopie von dem Dingen weiß leider nicht genau ob die auf dieses bufferedImage angewendet werden kann aber denke schon.
Gruß Steff

P.s. clone ist auf jeden Fall vorhanden habe gerade in der Api nach geschaut wird von Object geerbt obs funktioniert musst du probieren :-)
 
moin,
also ich finde die Methode clone() nicht in Bezug auf BufferedImages....
Vertue ich mich da oder geht die bei BufferedImages tatsächlich nicht?
 
Java Api guckst du da suchst mit strg+f nach BufferedImage im linken Frame. Guckst du dann unter Methods inherited from class java.lang.Object siehst du das es die Methode clone auch für BufferedImage gibt.

Steff
 
Super,
in meinem Fall mit kann ich den Code von oben durch folgenden ersetzen...

Code:
Raster m = grCanvas.getDisplayedImage().getRaster();
img.setData(m);

Raster mm = grCanvas.getDisplayedWhiteImage().getRaster();
imgWhite.setData(mm);

...
so macht posten Spaß :-)
Danke Steff
 
...die einfachste Möglichkeit dein BufferedImage zwischenzuspeichern wäre IMHO einfach ein neues BufferedImage zu erzeugen sich dessen Graphics Kontext geben zu lasssen und das zu kopierende Image da hineinzuzeichnen.

Gruß Tom
 
Morgen,

beim BufferedImage gibt es ja die Methode flush()

Jetzt überlege ich, wozu ich diese nutzen könnte. Um Resoursen freizusetzen, rufe ich beim Schließen meines Dialoges eine Methode auf, die jedes BufferedImage = null setzt, so dass der GC alle einsammeln kann.

Wozu brauche ich dann noch die Methode flush() ? Sie soll angeblich Resourcen freisetzen? Wann sollte man die denn aufrufen?

Danke
 
Zurück