OutOfMemory und Bilder

Status
Nicht offen für weitere Antworten.

The_S

Top Contributor
Hi,

habe festgestellt, dass ich beim Arbeiten mit Bildern sehr schnell einen OutOfMemoryError erhalte. Ich hab dann ein wenig rumgespielt und rumprobiert um zu testen, woran es liegt.

1. Ich bekomme beim Anzeigen großer Bilder einen OutOfMemoryError. Habe zuerst gedacht, dass es am skalieren liegt und deswegen einfach mal in ner endlos-Schleife ein Bild immer um 10 Prozent vergrößert. Als das Bild dann irgendwann mal um mehr als 20000 Prozent vergrößert war, ist selbst mir aufgefallen, dass es daran nicht liegen kann. Also bleibt noch das Anzeigen übrig. Das mache ich in einem JLabel, welches in einem JScrollPane liegt. Liegt das wirklich daran? Welche alternativen gibt es hier (eine eigene Klasse von JComponent abgeleitet ist auch nicht besser).

2. Auch wenn ich viele Bilder in einem Vector speichere bekomme ich einen OutOfMemoryError. Benötigt ein Vector den Arbeitsspeicher für seinen Inhalt am Stück oder ist ihm das egal, wo im Speicher sein Inhalt verteilt ist? Falls nicht egal, welche Klasse benötigt den Arbeitsspeicher nicht am Stück? (hoffe ich konnte mich einigermaßen verstänldich ausdrücken ;)).

Danke
 

Sky

Top Contributor
Erst mal die Frage, mit wie viel Memory startest Du (-Xms=??m) und wie viel steht max. zur Verfügung (-Xmx=??m)
 

The_S

Top Contributor
Standardeinstellungen. Wenn ich den Speicher hochsetze z. B. auf 512 MB ist dennoch die Grenze sehr bald erreicht (solange ich natürlich das Bild in nem JLabel und JScrollPane anzeigen lasse).
 

The_S

Top Contributor
Ich überschreibe nie die Paint Methode ...

Code:
JLabel pic = new JLabel(""); // label in dem das Bild dargestellt wird
JScrollPane scroll = new JScrollPane(pic);
...
	void scalePic() {

		float xScale = 1F + (float)widthSkal.getValue() / 100F; // Prozent für x, widthSkal ist ein JSlider
		float yScale = 1F + (float)highSkal.getValue() / 100F; // Prozent für y, highSkal ist ein JSlider
		int i = 0;
		if (artSkal.getSelectedIndex() == 1) { // Abfragen, welcher Algo verwendet werden soll
			i = Image.SCALE_FAST;
		}
		else if (artSkal.getSelectedIndex() == 2) {
			i = Image.SCALE_AREA_AVERAGING;
		}
		else if (artSkal.getSelectedIndex() == 3) {
			i = Image.SCALE_REPLICATE;
		}
		else if (artSkal.getSelectedIndex() == 4) {
			i = Image.SCALE_SMOOTH;
		}
		Image img = curImg.getScaledInstance((int)(curImg.getWidth() * xScale), (int)(curImg.getHeight() * yScale), i); // curImg = BufferedImage
		shownImg = new BufferedImage((int)(curImg.getWidth() * xScale), (int)(curImg.getHeight() * yScale), BufferedImage.TYPE_INT_ARGB); // ich benötige das Image in einem BufferedImage
		Graphics2D comp2D = shownImg.createGraphics();
		comp2D.drawImage(img, 0, 0, null);
		comp2D.dispose();
		pic.setIcon(new ImageIcon(shownImg)); // BufferedImage zuweisen
		highTex.setText(String.valueOf(shownImg.getHeight())); // ab hier nebensächlich, nur für die GUI
		widthTex.setText(String.valueOf(shownImg.getWidth()));
		validate();
		repaint();
	}
...
	public void stateChanged(ChangeEvent e) {
		
		Object source = e.getSource();
...
		else if (source == highSkal) {
			if (bothSkal.isSelected()) { // soll gleichmäßig skaliert werden?
				widthSkal.setValue(highSkal.getValue());
			}
			SwingUtilities.invokeLater(new Runnable() {
				public void run() {
					try {
						scalePic();
					}
					catch (OutOfMemoryError oome) {
						JOptionPane.showMessageDialog(null,
						"Ein kritischer Fehler ist aufgetreten: Nicht genügend Arbeitsspeicher verfügbar\n" + oome,
						"kritischer Fehler",
						JOptionPane.ERROR_MESSAGE);
					}
				}
			});
		}
		else if (source == widthSkal) {
			if (bothSkal.isSelected()) { // soll gleichmäßig skaliert werden?
				highSkal.setValue(widthSkal.getValue());
			}
			SwingUtilities.invokeLater(new Runnable() {
				public void run() {
					try {
						scalePic();
					}
					catch (OutOfMemoryError oome) {
						JOptionPane.showMessageDialog(null,
						"Ein kritischer Fehler ist aufgetreten: Nicht genügend Arbeitsspeicher verfügbar\n" + oome,
						"kritischer Fehler",
						JOptionPane.ERROR_MESSAGE);
					}
				}
			});
		}

Hoffe, das hilft weiter.
 

AlArenal

Top Contributor
Ich hab das Problem beim Speichern als Image. Ich hab visuelle Anwendungen, deren Output vom User als GIF und JPG exportiert werden kann. Für größere Sachen setzt es (trotz 512 MB maximalen Heaps) auch schonmal ne Exception. Ich habe dafür verschiene Bordmittel von Java/Sun zum Speichern verwendet und der Speicher wird darin verbraten. K.A. was die dadrin treiben.. wenn Photoshop so arbeiten würde, käme ich mit meinen 1.5 GB RAM hinten und vorne nicht hin...
 

Mag1c

Top Contributor
Hi,

1. über welche Bildergröße reden wir eigentlich ?

2. Hast du mal geprüft, wie oft er die stateChanged(...) durchläuft, während du die Größe änderst ?

3. wozu das BufferedImage ?

Gruß
Mag1c
 

The_S

Top Contributor
1. kritisch wirds ab ner Auflösung von 2000 x 1500
2. sooft, wie ich die Value von einen der beiden JSlider ändere
3. Weil das Bild später auch noch anderwertig bearbeitet werden soll, was mit einem BufferedImage leichter geht. Außerdem bin ich mir nicht sicher, ob Image transparenz darstellen kann!?

zu 2. duch das SwingUtilities.invokeLater sollte es doch aber zu keinen Problemen kommen!?
 

Mag1c

Top Contributor
Hi,

wozu machst du noch ein extra repaint() ? Sollte das nicht automatisch passieren ? Was ist pic ?

und wenn ich mal ganz enfach rechne:

2000 * 1500 * 32 / 8 = ca. 12 MB
+ skaliertes Image 12 MB
+ Buffered Image 12 MB

für einen Durchlauf. Beim nächsten ist vielleicht das skalierte Image vom GC weggeräumt aber es kommt ein neues
hinzu und gleich noch ein BufferedImage. Macht zusammen schon fast 50 MB NUR für die Images !!

Gruß
Mag1c
 

The_S

Top Contributor
pic ist wie oben erwähnt ein JLabel. Normalerweiße braucht man repaint nicht, aber ich hab noch ein paar GUI-Spielereien die das benötigen. Sollte jetzt aber auch nicht das Prob sein.

Erklär mir bitte deine Rechnung, hab gar nicht gewusst, dass man so den Speicherplatz berechnen kann. Thx. btw: für ein 2 Megapixelbild (1600 * 1200) benötige ich ca. 500 KB Speicher (allerdings auch jpg).

Wie meinst du deinen letzen Satz? Ich überschreibe doch immer wieder die alten Images.
 

Mag1c

Top Contributor
Hi,

ich muß allerdings dazu sagen, daß ich hier keine praktische Erfahrung habe. So große Images hab ich mit Java noch nicht bearbeiten wollen.

also zur Rechnung:

2000 * 1500 (== Anzahl der Pixel) * 32 (== Anzahl der Bits pro Pixel) / 8 (um Bytes rauszubekommen)
ergibt 12000000 Bytes, was ich fahrlässigerweise mal mit ca. 12 MB abgekürzt habe ;)

curImg = Instanz-Variable, belegt also permanent seine 12 MB

shownImg = Instanz-Variable, belegt also auch permanten die 12 MB

img = skaliertes Image = lokale Variable, belegt aber auch kurzzeitig 12 MB

wenn er nun das zweite mal in showPic langkommt, wird ein neues BufferedImage angelegt, bevor das alte gelöscht wird. Hier sind also kurzzeitig nochmal 12 MB weg.

Und was mir gerade noch eingefallen ist: prüfe mal, wieviel durch das DOUBLE_BUFFERED-Flag am JPanel draufgeht. Im Worst Case sind hier NOCHMAL 12 MB im Spiel :roll:

PS: Ja, das skalierte Bild und das BufferedImage variieren in der Größe je nach Skalierung. Ich habe der Einfachheit halber mal angenommen, daß die Skalierung 1 ist.

Gruß
Mag1c
 

The_S

Top Contributor
Gut (oder schlecht) dann muss ich da wohl mal schauen, ob ich das noch irgendwie optimieren kann. Danke!

Weiß eigentlich jemand was zu meinen 2. Punkt?
 

Bleiglanz

Gesperrter Benutzer
nur mal so als Idee:

brauchst du wirklich immer ein neues Bild und die diversen SCALE_xxx Parameter?

Code:
    protected void paintComponent(java.awt.Graphics g) {
        Graphics2D g2d = (Graphics2D) g;
        AffineTransform tx = new AffineTransform();
        tx.scale(faktor,faktor); // einfacher Faktor, vom JSpinner
        g2d.drawImage(this.image, tx, this);
    };

es geht WESENTLICH schneller, wenn du das Skalieren nur beim Zeichnen machen lässt
 

The_S

Top Contributor
Danke,

Kann ich mit AffineTransform auch verschiedene Skalierungsmodi wählen wie bei getScaledInstance? Oder anders gesagt, welchen algo verwendet AffineTransform bzw. welchem kommt er von getScaledInstance am nähesten?
 

Bleiglanz

Gesperrter Benutzer
Hobbit_Im_Blutrausch hat gesagt.:
Danke,

Kann ich mit AffineTransform auch verschiedene Skalierungsmodi wählen wie bei getScaledInstance? Oder anders gesagt, welchen algo verwendet AffineTransform bzw. welchem kommt er von getScaledInstance am nähesten?

1. Nein 2. gar keinen, oder wahrscheinlich FAST

BTW schau mal getScaledInstance genauer an, es werden eh nur zwei Varianten verwendet :)
Code:
    public Image getScaledInstance(int width, int height, int hints) {
	ImageFilter filter;
	if ((hints & (SCALE_SMOOTH | SCALE_AREA_AVERAGING)) != 0) {
	    filter = new AreaAveragingScaleFilter(width, height);
	} else {
	    filter = new ReplicateScaleFilter(width, height);
	}
	ImageProducer prod;
	prod = new FilteredImageSource(getSource(), filter);
	return Toolkit.getDefaultToolkit().createImage(prod);
    }
 

The_S

Top Contributor
Hm ... aber FAST ist schon eine sehr schlechte Qualität, wenn man sich das mal im Vergleich anschaut. Werds mal ausprobieren und wenn der unterschied so gewaltig ist, werde ich AffineTransform verwenden.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
R OutOfmemory Exception bei sehr großer Liste (Tomcat Webservice) Java Basics - Anfänger-Themen 4
A java.lang.OutOfMemory Java Basics - Anfänger-Themen 6
Butzibu Image Loader lädt nicht alle Bilder: Java Basics - Anfänger-Themen 4
Schniffi Nur bestimmte Bilder aus einem Array auf Image Button anzeigen lassen Java Basics - Anfänger-Themen 3
S Aktuell beste Methode um zwei Bilder zu vergleichen..? Java Basics - Anfänger-Themen 1
W Java in Exe Datei umgewandelt, Ressourcen fehlen (Bilder und Audiodateien) Java Basics - Anfänger-Themen 1
B Nach dem kompilieren werden Bilder nicht mehr gefunden Java Basics - Anfänger-Themen 10
C Erste Schritte Bilder nach Export anzeigen Java Basics - Anfänger-Themen 0
B HTML File einlesen inkl. Bilder? Java Basics - Anfänger-Themen 2
S Bilder über Socket Senden Java Basics - Anfänger-Themen 1
S Bilder in .jar Datei laden Java Basics - Anfänger-Themen 10
S Bilder zoomen Java Basics - Anfänger-Themen 0
S Kann keine Bilder laden? Java Basics - Anfänger-Themen 9
CptK Interface Bilder über Bildschirm bewegen, bis der Abstand zum vorherigen zu groß wird Java Basics - Anfänger-Themen 13
CptK Interface Bilder mit Graphics g zeichnen Java Basics - Anfänger-Themen 7
I Projekt als .jar Datei speichern - Bilder werden nicht mehr angezeigt Java Basics - Anfänger-Themen 4
x-tshainge Java Bilder einfügen Java Basics - Anfänger-Themen 1
B Auslesen von PDF / Bilder Java Basics - Anfänger-Themen 5
DaCrazyJavaExpert Bilder werden nicht angezeigt! Java Basics - Anfänger-Themen 6
L Verschiedene Bilder per Knopfdruck anzeigen lassen Java Basics - Anfänger-Themen 17
M Bilder in .Jar exportieren Java Basics - Anfänger-Themen 2
T Bilder in ausführbarer Jar Java Basics - Anfänger-Themen 11
F 2 wechselnde Bilder Java Basics - Anfänger-Themen 4
D Verzögerung des Erscheinens der Bilder Java Basics - Anfänger-Themen 5
L BufferdImage schwarzes Bild nach zusammenfügen zweier Bilder Java Basics - Anfänger-Themen 8
F Bilder aus jar einlesen Java Basics - Anfänger-Themen 10
J Bilder in Labels aktualisieren Java Basics - Anfänger-Themen 2
T jpeg Bilder zoomen.. Java Basics - Anfänger-Themen 2
C Bilder von Festplatte in Programm hochladen Java Basics - Anfänger-Themen 6
S Wo speicher ich bilder und sounds ab? Java Basics - Anfänger-Themen 4
C Threads Threaded Bilder bearbeiten Java Basics - Anfänger-Themen 8
K Bilder mit Eclipse exportieren Java Basics - Anfänger-Themen 1
J Slideshow zeigt bilder nicht an Java Basics - Anfänger-Themen 3
R Bilder aus Array als anklickbare Objekte Java Basics - Anfänger-Themen 3
K Export nach Jar mit Bilder Java Basics - Anfänger-Themen 2
L Wie bette ich Bilder in eine .jar ein? Java Basics - Anfänger-Themen 4
C Pfad für Bilder angeben Java Basics - Anfänger-Themen 11
B Bilder laden und drauf zugreifen[Eclipse] Java Basics - Anfänger-Themen 9
E ImageJ mehrere Bilder hintereinander bearteiten Java Basics - Anfänger-Themen 2
E HILFE Projekt für die Schule--> Bilder einfügen Java Basics - Anfänger-Themen 9
D 2 Fragen: Position ändern vs. LayoutManager / Bilder einfügen im Vordergrund Java Basics - Anfänger-Themen 3
H Bilder ohne Verlust speichern Java Basics - Anfänger-Themen 2
J Ladebalken anzeigen während Bilder geladen werden Java Basics - Anfänger-Themen 2
R Bilder positionieren Java Basics - Anfänger-Themen 5
D Erstellte Jar datei zeigt keine Bilder an Java Basics - Anfänger-Themen 5
4 4kb bilder Java Basics - Anfänger-Themen 5
Q Pfadangabe für zu speichernde Bilder Java Basics - Anfänger-Themen 2
B Bilder speichern (jpg, gif, jpg) Java Basics - Anfänger-Themen 4
S Bilder einladen Java Basics - Anfänger-Themen 26
B Aus einem Eclipse Projekt eine .jar - keine Bilder drin Java Basics - Anfänger-Themen 7
H Bilder im GUI einfügen Java Basics - Anfänger-Themen 12
G Bilder in Jar anzeigen lassen Java Basics - Anfänger-Themen 23
T Bilder in der jar-datei Java Basics - Anfänger-Themen 10
H Zahlen Bilder zuordnen möglich? Java Basics - Anfänger-Themen 4
K BufferedImage, Bilder laden Java Basics - Anfänger-Themen 15
J Bilder von Objekten Java Basics - Anfänger-Themen 3
A Bilder in Eclipse speichern Java Basics - Anfänger-Themen 7
J Mit JS, Text und Bilder von Webseite verändern... Java Basics - Anfänger-Themen 10
S Input/Output Text und Bilder laden Java Basics - Anfänger-Themen 5
T Bilder werden in Jar nicht geladen Java Basics - Anfänger-Themen 10
S Java Web Start lädt keine Bilder Java Basics - Anfänger-Themen 2
T Buttons (auf denen bilder sind) random vertauschen Java Basics - Anfänger-Themen 11
D Bilder Laden, mit Eclipse ok, .jar nicht Java Basics - Anfänger-Themen 5
F Bilder aus .jar datei laden Java Basics - Anfänger-Themen 1
M Applet soll Bilder aus Ordner lesen Java Basics - Anfänger-Themen 9
T Transparente Bilder mit Graphics zeichnen Java Basics - Anfänger-Themen 17
F Bilder enfügen und Bewegen Java Basics - Anfänger-Themen 6
I Drehbare bilder in 3D Java Basics - Anfänger-Themen 4
M Bilder laden und zeichnen Java Basics - Anfänger-Themen 3
T JTextPane - setText kein kein neuladen der Bilder? Java Basics - Anfänger-Themen 8
A Bilder in Eclipse Java Basics - Anfänger-Themen 8
xehpuk Ordner "Eigene Bilder" ansteuern Java Basics - Anfänger-Themen 3
N Bilder Objekten zuweisen Java Basics - Anfänger-Themen 2
J Bilder auf Bilder zeichnen Java Basics - Anfänger-Themen 8
N jar kann Bilder nicht finden(?) Java Basics - Anfänger-Themen 4
S Spiel automat -Bilder vergleichen Java Basics - Anfänger-Themen 3
R Gif Bilder flimmern Java Basics - Anfänger-Themen 10
P Signiertes JAR aber keine Bilder o0 Java Basics - Anfänger-Themen 6
S Bilder der Diashow werden in anderen Bildern angezeigt Java Basics - Anfänger-Themen 3
G Bilder aus dem Projekt Verzeichnis werden n. angezeigt Java Basics - Anfänger-Themen 7
C Bilder von Server zu Server kopieren über Webdav(Sardine) Java Basics - Anfänger-Themen 5
K Bilder "langsam" laden Java Basics - Anfänger-Themen 4
FreddyStepp Bilder zusammenfügen Java Basics - Anfänger-Themen 7
B GUI-Bilder einfügen Java Basics - Anfänger-Themen 40
S Bilder vergleichen Java Basics - Anfänger-Themen 6
B Kann man im Thread Bilder laden? Java Basics - Anfänger-Themen 8
S Wo speichere ich Bilder für Applets (Netbeans) Java Basics - Anfänger-Themen 5
J Mehrere Bilder laden Java Basics - Anfänger-Themen 6
D Bilder einfügen Java Basics - Anfänger-Themen 8
W Bilder einfügen? Java Basics - Anfänger-Themen 2
S Mehrere Bilder bewegen Java Basics - Anfänger-Themen 5
B Bilder zeichnen Java Basics - Anfänger-Themen 2
D Bilder in JFrame laden Java Basics - Anfänger-Themen 8
L Frage bzgl. Threads beim Bilder laden Java Basics - Anfänger-Themen 3
S Bilder in AWT Java Basics - Anfänger-Themen 7
J java applets bilder? Java Basics - Anfänger-Themen 11
manunana89 Bilder auf JFrame/beste Möglichkeit??? Java Basics - Anfänger-Themen 5
K Bilder werden nicht angeziegt !!! Java Basics - Anfänger-Themen 2
max56 Bilder ausgeben Java Basics - Anfänger-Themen 21
K Bilder/Dateien aus package einlesen Java Basics - Anfänger-Themen 14

Ähnliche Java Themen

Neue Themen


Oben