Nehmen wir einmal an, ein Anfänger möchte Bildverarbeitung in Java realisieren und baut sich, zur Weiterverarbeitung, eine ArrayList mit Objekten eines Typs "Bild".
Die Klasse "Bild" erbt von "BufferedImage", führt ein paar Berechnungen durch und speichert die Ergebnisse in Klassenvariablen.
Die Information der einzelnen Pixel wird also am Ende nicht benötigt.
Problem ist nun, dass ich die Pixelinformation, die "BufferedImage" zwischenspeichert nicht wieder wegbekomme. flush() sollte evtl. tun, was ich will, nur tut es das nicht.
Resultat: sehr viel Arbeitsspeicher wird beansprucht ‒ Heap Space ist schnell voll.
Gibt es eine einfache Lösung, das Ding dazu zu bringen, dass nur noch die Werte der Klassenvariablen und nicht sämtliche Pixelinformation erhalten bleibt?
Es folgt der hoffentlich entscheidende Code-Schnipsel:
Dankeschön schon an dieser Stelle!
PS: Gibt es vielleicht eine simple Möglichkeit, zu schauen, wer/was den Arbeitsspeicher wie stark belegt?
Die Klasse "Bild" erbt von "BufferedImage", führt ein paar Berechnungen durch und speichert die Ergebnisse in Klassenvariablen.
Die Information der einzelnen Pixel wird also am Ende nicht benötigt.
Problem ist nun, dass ich die Pixelinformation, die "BufferedImage" zwischenspeichert nicht wieder wegbekomme. flush() sollte evtl. tun, was ich will, nur tut es das nicht.
Resultat: sehr viel Arbeitsspeicher wird beansprucht ‒ Heap Space ist schnell voll.
Gibt es eine einfache Lösung, das Ding dazu zu bringen, dass nur noch die Werte der Klassenvariablen und nicht sämtliche Pixelinformation erhalten bleibt?
Es folgt der hoffentlich entscheidende Code-Schnipsel:
Java:
/**
* Generiert Thumbnail, führt Berechnungen durch.
*
* @param picture
* ein ganzes Bild
* @param filename
* Dateiname
* @param calcRGB
* Berechnungsart
*/
public Bild(BufferedImage picture, String filename, boolean calcRGBmax) {
super(picture.getColorModel(), picture.copyData(null), picture
.isAlphaPremultiplied(), null);
this.filename = filename;
int aspectRatio = (int) (getWidth() / getHeight() + 0.5);
// skalieren und Thumbnail generieren
if (aspectRatio < 4) {
thumbnail = getScaledInstance(-1, 25,
BufferedImage.SCALE_SMOOTH);
} else {
thumbnail = getScaledInstance(100, -1,
BufferedImage.SCALE_SMOOTH);
}
(...)
flush(); // tut nichts
}
Dankeschön schon an dieser Stelle!
PS: Gibt es vielleicht eine simple Möglichkeit, zu schauen, wer/was den Arbeitsspeicher wie stark belegt?