Skalieren von Image -> java.lang.OutOfMemoryError - WARUM

Status
Nicht offen für weitere Antworten.
H

HaraldM

Gast
Wie kann ich beim Skalieren eines Bildes einen java.lang.OutOfMemoryError Fehler verhindern?

Es geht um folgendes:

Ich habe ein Imageobjekt 'image' welches auf eine JPEG Datei zeigt. Dieses JPEG Bild ist 3072x2304 Pixel groß (400kb).
Versuche ich nun dieses Bild mit

Code:
image = image.getScaledInstance(1300, 1300, Image.SCALE_DEFAULT);

auf 1300x1300 zu skalieren, kommt ein java.lang.OutOfMemoryError Fehler. Versuche ich, das Bild auf einen kleineren Wert zu skalieren (z.b. 1000x1000) kommt dieser Fehler nicht. Es ist ebenfalls möglich, ein etwas kleineres Bild (z.b. 2000x2000) auf die Größe 1300x1300 zu skalieren.


Wie kann ich nun diese blöden Fehler verhindern? Es kann doch nicht sein, dass ich mit Java 1.4 und 512 MB RAM ein etwas größeres JPEG nicht skalieren kann.

MfG
Harald
 
H

HaraldM

Gast
super, danke, das funktioniert.

jetzt habe ich aber ein anderes problem. wie kann ich den speicher wieder freigeben?

mein programm ist ein screensaver - solange er minimiert läuft und noch keine bilder anzeigte, benötigt er 2 MB. startet er nun "richtig" und zeigt mehrere bilder an (in einem neuen thread), dann belegt die jvm trotzdem rund 100 mb auch wenn der thread wieder geschlossen ist.

interessant ist, dass wenn ich das eigentliche screensaver programm (für die einstellungen etc) maximiere und dann wieder minimiere, der speicher freigegeben wird.

kann ich das auch irgendwie manuell veranlassen?

mfg!
harald
 

Wildcard

Top Contributor
Du kannst es mal mit System.gc() versuchen, aber du hast vermutlich noch Referenzen auf die Bilder gespeichert und bekommst deshalb den Speicher nicht zurück.
100mb kommt mir viel zu viel vor, aber ohne deinen Code zu kennen...

EDIT:
es währe übrigens sehr zu empfehlen ein so großes Bild schon vorher in einem Grafikprog zu skalieren und direkt mit dem kleineren Bild zu arbeiten.
 
G

Guest

Gast
Wildcard hat gesagt.:
aber ohne deinen Code zu kennen...
quote]

Der Code sieht sinngemäß so aus

Code:
                                            while (true) {
			try {
			System.out.println("new round");
			ImageIcon im = new ImageIcon("c:\\1.jpg");
			Image image = im.getImage();
			image = image.getScaledInstance(1000, 1000, Image.SCALE_SMOOTH);
			im = new ImageIcon(image);
			
			Thread.sleep(5000);
			
			im = new ImageIcon("c:\\2.jpg");
			image = im.getImage();
			image = image.getScaledInstance(1000, 1000, Image.SCALE_SMOOTH);
			im = new ImageIcon(image);
			
			Thread.sleep(5000);
			
			im = new ImageIcon("c:\\3.jpg");
			image = im.getImage();
			image = image.getScaledInstance(1000, 1000, Image.SCALE_SMOOTH);
			im = new ImageIcon(image);
			
			Thread.sleep(5000);
				
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
		}


mit jedem bild das verarbeitet wird steigt der speicherbedarf um rund 30 MB (bei 100 bleibt er dann, weil ich die jvm auf 100mb beschränkt habe). fängt die while schleife von vorne an, ändert sich am speicherbedarf nichts mehr.

eigentlich würde ich denken, dass wenn 'im' und 'image' durch das zweite bild überschrieben wird, das erste bild automatisch aus dem speicher gelöscht wird. aber das ist leider nicht der fall.

wie kann ich das erzwingen?

mfg
 

Wildcard

Top Contributor
Momentmal, du hast 3 Bilder und erzeugst diese ständig neu???
Und dann hast du auch noch jedes Image 3MAL im Speicher!!!
Warum verwendest du nicht die alten weiter?
Kein wunder das du soviel Speicher brauchst...
 
H

HaraldM

Gast
hi,

das war nur beispielhaft. in wirklichkeit sieht's anders aus aber dieses code beispiel demonstriert genau mein problem.

ich skaliere mehrere bilder und mit jedem bild steigt der speicherbedarf um 30 MB obwohl ich immer die gleichen Image und ImageIcon Objekte überschreibe.
 

KISS

Bekanntes Mitglied
rufe doch zwischendurch mal Image.flush() auf, und in der zeit in der du wartest (nimm wait) kannst du ja noch den gc forcen. kann es sein das deine anzeige flackert?
 

Wildcard

Top Contributor
bin mir nicht sicher nach welchen Kriterien der gc Image-Objekte beseitigt, aber 30mb pro Bild sollte eigentlich nicht sein
 

KISS

Bekanntes Mitglied
kommt drauf an, wenn genug speicherplatz zur verfuegung steht wird der gc nicht unbedingt aktiv, zumal sich in seinem beispiel alles im selben scope abspielt und 1000*1000*32 (rgba) sind bei mir recht genau 30MB
 

Wildcard

Top Contributor
falls du das tatsächlich so ähnlich machst wie oben kann ich dir nur den Tipp geben entweder vorskalieren, oder die Bilder EINMAL erzeugen und dann das Graphics Objekt skalieren.
 
H

HaraldM

Gast
.flush hilft leider auch nicht.
die anzeige flackert sind. außerdem tritt das problem auch auf, wenn ich das bild überhaupt nicht in einer gui anzeige.

30 MB ist schon ok, das hängt von der Bildgröße ab. Die Bilder sind von ner 5 MegaPixel Kamera. Du brauchst also ca. 18 MB pro Original im Speicher und dann nochmal ein paar MB für das skalierte Bild

sonst noch jemand ideen???
 

KISS

Bekanntes Mitglied
ja, nimm mal Xmx wieder auf einen kleineren wert (30MB oder so), in meiner testschleife laesst sich der gc nicht uebereden den speicher aufzuraeumen solange er noch mehr als 1MB free memory hat
 

KISS

Bekanntes Mitglied
sorry, kam nur bis zur signatur Color(int,int,int,int), das intern nur je das lsbyte genutzt wird ist mir entgangen
 
H

HaraldM

Gast
bisher klappte leider keiner eurer vorschläge.

was mich erstaunt, ist, dass wenn ich meine anwendung minimiere, der speicher aufgeräumt wird. es muss doch also auch eine möglichkeit geben, das manuell zu machen.

die anwendung mit tofront() in den vordergrund und toback() in den hintergrund zu bringen hilft leider nicht.
 

Hansdampf

Bekanntes Mitglied
was mich erstaunt, ist, dass wenn ich meine anwendung minimiere, der speicher aufgeräumt wird. es muss doch also auch eine möglichkeit geben, das manuell zu machen.
das Problem hab ich auch bei einer Anwendung, der Speicherverbrauch nimmt dauernd zu. Das Lustige dabei ist: mit Excelsior Jet umgewandelt verschwindet das Problem... (der Speicherzuwachs).

muss man das kapieren?
ein argb Pixel braucht nur 4 Byte=1 int, nicht 4.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Image Skalieren Allgemeine Java-Themen 23
A GUI skalieren Allgemeine Java-Themen 3
RalleYTN 2D-Grafik Bild mit bilinearer Interpolation skalieren Allgemeine Java-Themen 31
D Tool zum skalieren von bildern Allgemeine Java-Themen 4
S Sinnvolles skalieren von Werte-Set? Allgemeine Java-Themen 2
S Linie skalieren Allgemeine Java-Themen 13
F 2D-Grafik Qualitätsverlust beim Skalieren Allgemeine Java-Themen 4
F Bild aus externer Quelle laden und Skalieren? Allgemeine Java-Themen 11
G AffineTransform Skalieren? Allgemeine Java-Themen 2
P Wieso skalieren diese beiden Threads unterschiedlich gut? Allgemeine Java-Themen 16
G Bilder skalieren Allgemeine Java-Themen 2
D Image bewegt sich nicht nach Klicken auf Button Allgemeine Java-Themen 15
Mozart53 JLabel nur meinen Text verschieben ohne Image Allgemeine Java-Themen 3
Y Wie bekomme ich durch getImage an das Image heran? Allgemeine Java-Themen 1
J jsch direktes streamen in ein image Allgemeine Java-Themen 11
A 2D-Grafik Einfachster Ansatz, um sich wiederholende Figur in einem 2D-Image zu erkennen Allgemeine Java-Themen 1
T 2D-Grafik Chart als Image erstellen Allgemeine Java-Themen 3
G Image in Shape wandeln Allgemeine Java-Themen 1
T Swing Image rotieren Allgemeine Java-Themen 1
I nach Image Load in ListView, kann Ordner nicht mehr gelöscht werden Allgemeine Java-Themen 1
C pfad vom Image ausgeben lassen Allgemeine Java-Themen 5
Bananabert Swing jtree : image als user object Allgemeine Java-Themen 2
M Image auslesen Allgemeine Java-Themen 2
G Pixelanzahl aus Raw Image Datei Allgemeine Java-Themen 1
H OCR und Image Processing Allgemeine Java-Themen 4
M Image für PDF nicht verfügbar - Runnable .jar Allgemeine Java-Themen 3
S BLOB Image in JSP anzeigen Allgemeine Java-Themen 5
BRoll Image RGB Werte auslesen und vergleichen Allgemeine Java-Themen 8
K Image zu BufferedImage konvertieren Allgemeine Java-Themen 9
K Image beim catchen ist immer null Allgemeine Java-Themen 9
X Image Processing libary für JavaSE und Android Allgemeine Java-Themen 2
Crashbreaker RCP-View Image öffnen und darstellen Allgemeine Java-Themen 7
S IMAGE ARRAY laden Allgemeine Java-Themen 6
B Image oder GridControl? Allgemeine Java-Themen 8
B Image Thinning Allgemeine Java-Themen 3
A Input/Output Buffered Image zu Byte Array und zurück konvertieren Allgemeine Java-Themen 4
F Datentypen Floppy-Image-Dateisystem Allgemeine Java-Themen 5
F Image - Ausschnitt bekommen Allgemeine Java-Themen 3
J Teil eines Image/ImageIcon zeichnen Allgemeine Java-Themen 2
N Unable to convolve src image Allgemeine Java-Themen 7
H image in jtextarea/JLabel einbinden... Allgemeine Java-Themen 4
Aigu Bilderkennung / Image Analysis Allgemeine Java-Themen 2
M Nochmal I-Frame zu Image Allgemeine Java-Themen 4
M JPEG Image komprimieren Allgemeine Java-Themen 2
M Probleme mit Image Extraction aus PDF Allgemeine Java-Themen 2
V Image laden - URL über ClassLoader ermitteln Allgemeine Java-Themen 2
G sun.awt.image.OffScreenImage Serializable machen Allgemeine Java-Themen 5
T Image in gif umwandeln Allgemeine Java-Themen 14
G itext größe von image Allgemeine Java-Themen 2
T JPanel to Image? Allgemeine Java-Themen 6
K Image Resizer Allgemeine Java-Themen 4
D Image runterscalieren, aber schlechte Quali? Allgemeine Java-Themen 3
L Buffered Image teilweise zeichnen Allgemeine Java-Themen 6
P Image erzeugen Allgemeine Java-Themen 7
B Image libraries Allgemeine Java-Themen 3
MQue Image über Komponente Allgemeine Java-Themen 3
P Image auf JPanel auf JFrame Allgemeine Java-Themen 3
P Image auf einem Panel mit null-Layout Allgemeine Java-Themen 8
E Image unterscheiden Allgemeine Java-Themen 16
E Image auf einem JLabel darstellen Allgemeine Java-Themen 3
F BufferedImage -> Image Allgemeine Java-Themen 4
E Wie bekomme ich mein Image in das Fenster Allgemeine Java-Themen 2
T Muster/Zeichen/Texterkennung auf einem Image Allgemeine Java-Themen 9
L Linien, Recktecke und Elipsen zeichnen ohne Image Allgemeine Java-Themen 2
T Disk Image Library (iso,mdf,nrg,bin) Allgemeine Java-Themen 6
S KeyListener! Image Problem! Allgemeine Java-Themen 2
S Image als Background Allgemeine Java-Themen 5
B Image(png) versenden Allgemeine Java-Themen 3
N Image -> cropImage Allgemeine Java-Themen 3
T Image mithilfe von DirectColorModel und Pixel erstellen Allgemeine Java-Themen 3
G Image in der Größe ändern Allgemeine Java-Themen 2
C probleme mit image Allgemeine Java-Themen 4
C Pixelfarbe aus einem image auslesen Allgemeine Java-Themen 6
D ByteArray für Image-Icon laden. Allgemeine Java-Themen 4
T iso datei (Image) mit Java einlesen und Inhalt entpacken Allgemeine Java-Themen 3
O Image mit transparenten farben wie bei *.GIF ? Allgemeine Java-Themen 3
B Image#getScaledInstance & Graphics2D#drawImage ClassCast Allgemeine Java-Themen 3
H Speicher freigeben klappt nicht bei Image Objekten, warum? Allgemeine Java-Themen 8
T Auf ein Image geklickt Allgemeine Java-Themen 13
J ISO image erzeugen Allgemeine Java-Themen 3
J Wie mache ich den Hintergrund einer Image durchsichtig? Allgemeine Java-Themen 7
G Aus JPanel Image Hohlen Allgemeine Java-Themen 3
D BufferedReader in image umwandeln Allgemeine Java-Themen 3
S Image Datei serializieren Allgemeine Java-Themen 3
G JFrame nimmt mein Image nicht Allgemeine Java-Themen 2
F Image als GIF oder JPEG abspeichern Allgemeine Java-Themen 2
OnDemand Java Deployment Vaadin Allgemeine Java-Themen 3
D Hat Java eine Library um JavaScript auszuwerten? Allgemeine Java-Themen 2
Zrebna Wieso sind eigentlich JUnit-Tests in src/test/java platziert - nur Konvention? Allgemeine Java-Themen 7
N LlaMA, KI, java-llama.cpp Allgemeine Java-Themen 39
V Java-Codierungsherausforderung: Navigieren durch die Macken der Datumsmanipulation Allgemeine Java-Themen 2
E Output Fehler (Java-Programm Kuchen) Allgemeine Java-Themen 11
M java: unexpected type Allgemeine Java-Themen 2
harrytut Java Input/Output Tests Junit Allgemeine Java-Themen 3
B Java Discord bot auf ein Root Server? Allgemeine Java-Themen 1
BetziTheRealOne Java PKIX path building failed as non Admin Allgemeine Java-Themen 15
D Linux, Java-Version wird nicht erkannt bzw. welche Einstellung fehlt noch? Allgemeine Java-Themen 19
KonradN Java 21 Release Allgemeine Java-Themen 5
V Umgang mit fehlenden Daten in einer Java-Datenanalyseanwendung Allgemeine Java-Themen 5
P Fehler: Hauptklasse Main konnte nicht gefunden oder geladen werden Ursache: java.lang.ClassNotFoundException: Main Allgemeine Java-Themen 24

Ähnliche Java Themen

Neue Themen


Oben