Laden von Bilddateien erzeugt OutOfMemory Error

erazor_mx

Mitglied
Hallo zusammen,
ich kämpfe nun schon seit zwei Tagen mit einem OutOfMemory Error in einer Photo-Viewer Applikation.

Zur Problembeschreibung:
Ich lade meine Bilder von Festplatte und stelle sie intern als ImageIcons dar. Diese Bilder speichere ich dann in einem Album, welches durch eine Klasse mit einem Vector<ImageIcon> realisiert ist.
Der besagte Fehler tritt nun auf, nachdem ich maximal 7 Bilder á 1.2MB geladen habe. Das macht für mich Pi mal Daumen 8MB an Speicher für das Album. Ich habe es auch schon mit anderen Datenstrukturen für das Album und andere Java Imagetypen versucht. Leider ohne Erfolg.

Beim Durchsuchen des allswissenden Googels fand ich nur so Sachen wie Speicher für JVM erhöhen. Dies würde den Fehler aber nicht verschwinden lassen sondern nur nach hinten verschieben.

Vielleicht hatte hier schon jemand dasselbe Problem oder kennt sich damit aus.

Beste Grüße =)
 
Sind die Bilder vielleicht zufällig auf der Festplatte 1.3 MB groß? Wenn das ein JPG mit z.B. 3000x2000 Pixeln ist, belegt so ein Ding im Speicher immerhin mindestens 24MB... Standardmäßig bekommt die VM nicht so viel zugesichert, also mit einem
java -Xmx1000m DasProgramm
sollte das Problem weit genug nach hinten geschoben sein. Ansonsten wirst du dir Mechanismen für effizientes neuladen von neuen und Verwerfen von alten Bildern überlegen müssen.
 
Ja z.B. 1.2 MB auf der Festplatte. Daran hab ich jetzt gar nicht gedacht 😳 .
Ich könnte mir einzigst noch vorstellen nur dem Dateipfad im Album abzuspeichern und bei Bedarf das Bild zu laden. Dadurch würde das Bild aber natürlich nicht sofort zur Verfügung stehen.

Vielleicht sollte ich noch hinzufügen, dass obwohl auf der Konsole der Error ausgegeben wird, das Programm momentan ohne Probleme weiter läuft und auch die geladenen Bilder von der Festplatte alle samt im Vector zur Verfügung stehen.
 
Hm... kaum zu glauben...
Einen flotten Bildbetrachter zu schreiben, mit dem man mal locker durch eine Liste von 3000x2000er-Bildern blättern kann, ist verdammt schwer... Und bei Java hat man auch nicht viele Möglichkeiten, da was schneller zu machen... man könnte es als einen Tradeoff bezeichnen: Es ist toll, mit
Image i = ImageIO.read(file);
ein Bild laden zu können, aber viel optimieren kann man da dann eben nicht....

In C könnte man ja die libjpeg verwenden :lol: (Nee, echt, hat schonmal jemand versucht, die zu verwenden? ???:L ).
 
Java:
thumbnailList.addListSelectionListener(new ListSelectionListener() {
			public void valueChanged(ListSelectionEvent e) {
				if(e.getValueIsAdjusting()) return;
				int i = thumbnailList.getSelectedIndex();
				pictureLabel.setIcon(null);
				pictureLabel.setIcon(new ImageIcon(album.getPicture(i).getPathname()));
			}
		});

Ich habe es jetzt mit dem abspeichern vom Pathname geöst. Beim Klicken auf einen Thumbnail soll das Bild in Originalgröße auf einem JLabel dargestellt werden. Aber auch hier wird ein OutOfMemomry Error erzeugt. Habe es schon versucht mit setIcon(null) wieder aus dem Speicher zu entfernen. Ohne erfolg 🙁
 
[JAVA=82]thumbnailList.addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e) {
if(e.getValueIsAdjusting()) return;
int i = thumbnailList.getSelectedIndex();
if(icon != null) icon.getImage().flush();
icon = new ImageIcon(album.getPicture(i).getPathname());
pictureLabel.setIcon(icon);
}
});[/code]

ein einfaches flush() auf das ImageIcon reicht aus um den Fehler zu beheben 😉

Hat sich also erledigt.
 

Neue Themen


Zurück
Oben