ImageIcon in Byte-Array ablegen

gbunge

Aktives Mitglied
Hallo Java
ich habe mir ein Programm programmiert, mit dem ich einen Ordner mit
unsortierten Bilder so aufbereiten kann, dass die Bilder für eine
Diashow thematisch und zeitlich geordnet sind.
Dazu lese ich alle Bilder ein und skaliere sie zu ImageIcons.

Das Programm läuft so wie ich es mir gedacht habe, allerdings nur
so lange wie ich ( für die Programmierphase ) nur zehn Bilder einlese.
Beim ersten Lauf mit einem tatsächlichen Bildordner stieg es mit einer
Exception aus.
" Exception in thread "Thread-0" java.lang.OutOfMemoryError: Java heap space "
Das tritt ein, wenn ich mehr als 120 Bilder einlesen will.

Ich habe mir nun eine Änderung überlegt.
Ich lege alle ImageIcons an, speichere sie aber nicht im Programm,
sondern in jeweils einem Binär-File auf der Festplatte.

Hier ist nun mein Problem.
Mir gelingt es nicht, das ImageIcon in ein Byte-Array zu schreiben.

[CODE lang="java" title="Programmsegment"]

private static ImageIcon[] iconList;

// Image in ImageIcon wandeln
iconList[0] = new ImageIcon( sImg );

// ImageIconList speichern
BufferedOutputStream bos = null;
try {

bos = new BufferedOutputStream( new FileOutputStream("datei.bin") );
byte[] buf = (byte)iconList[0];
bos.write( buf );
}
catch( IOException ex) {
System.out.println(ex);
}
finally {
if(bos!=null)
try {
bos.close();
}
catch(Exception ex) {
}
}

[/CODE]

Kann mir dabei jemand helfen?
Gruss GBunge
 

mihe7

Top Contributor
Ich verstehe gerade den großen Unterschied bzgl. des Speicherbedarfs nicht: wenn Du eine Reihe von Bildern nacheinander einliest, skalierst und nur die skalierte Version im Speicher hältst, ist das größte Bild im Wesentlichen der Overhead gegenüber dem Einlesen von bereits skalierten Bildern.

Auf welche Größe skalierst Du denn?

(NB: für das, was Du gerade vorhast, brauchst Du ImageIcon nicht. Du kannst mit ImageIO arbeiten).
 

gbunge

Aktives Mitglied
Ich verstehe gerade den großen Unterschied bzgl. des Speicherbedarfs nicht: wenn Du eine Reihe von Bildern nacheinander einliest, skalierst und nur die skalierte Version im Speicher hältst, ist das größte Bild im Wesentlichen der Overhead gegenüber dem Einlesen von bereits skalierten Bildern.

Auf welche Größe skalierst Du denn?

(NB: für das, was Du gerade vorhast, brauchst Du ImageIcon nicht. Du kannst mit ImageIO arbeiten).
Hallo mihe7,
1. mit "Bilder einlesen" meine ich, dass ich den absoluten Pfad in eine ArrayList eintrage und bei Anzeige des Bildes
vorher die Datei einlese und das Bild skaliere. Das Bild steht also vorher nicht im Programm. Aber das ImageIcon
speichere ich natürlich im Programm, damit ich nicht jedesmal skalieren muss.

2. skaliert wird das Bild nach dem Einlesen der Datei auf die Größe des Programmfensters. Das ImageIcon ist also
kleiner als das Originalbild und nur das ist im Programm gespeichert und führt nach etwa 100 Bildern zur Extention:

3. zum dritten Punkt: ImageIcon benutze ich, weil das Bildfenster im Programm ein JLabel ist.
und durch die Speicherung des ImageIcons in einer Binärdatei spare ich beim nächsten Anzeigen des Bildes die
langwierige Skalierung.
 

mihe7

Top Contributor
OK, dann würde ich folgendes machen:

1. nur ein ImageIcon
2. wenn ein Bild angezeigt werden soll, prüfen, ob das Bild bereits skaliert vorliegt
3. wenn ja, das skalierte Bild einlesen und anzeigen. Fertig.
4. wenn nein, das Bild skalieren, speichern und anzeigen. Fertig.

Auf diese Weise hältst Du immer nur ein Bild im Speicher. Zum Lesen/Schreiben kannst Du ImageIO verwenden. Das BufferedImage kannst Du in ein ImageIcon stecken.
 

gbunge

Aktives Mitglied
OK, dann würde ich folgendes machen:

1. nur ein ImageIcon
2. wenn ein Bild angezeigt werden soll, prüfen, ob das Bild bereits skaliert vorliegt
3. wenn ja, das skalierte Bild einlesen und anzeigen. Fertig.
4. wenn nein, das Bild skalieren, speichern und anzeigen. Fertig.

Auf diese Weise hältst Du immer nur ein Bild im Speicher. Zum Lesen/Schreiben kannst Du ImageIO verwenden. Das BufferedImage kannst Du in ein ImageIcon stecken.
Ja, dabei muss ich aber das Bild vorher skalieren, damit es skaliert auf der Festplatte liegt ( Dein Punkt 3 )
auf der Festplatte liegt dann das originale Bild und sinnvollerweise in einem anderen Ordner das skalierte Bild.
So hatte ich es ja auch vor. Nur wollte ich statt des skalierten Bildes die Pixel in einer Binärdatei ablegen.
Ich dachte die ist weniger groß als eine JPG-Datei.
 

gbunge

Aktives Mitglied
Oje, unkomprimiert ist das Billd Breite * Höhe * 3 Bytes groß :)
Hallo mihe7

ich habe die skalierten Bilder als verkleinerte JPG-Dateien in einem vorübergehenden Sonderordner mit dem originalen Namen gespeichert. Die Bilder im Sonderordner, angesehen mit einem Bildbetrachter , waren alle in Ordnung nur eben, entsprechend der Skalierung, kleiner.

Wenn ein bestimmtes Bild dargestellt werden sollte, dann habe ich es aus dem Sonderordner gelesen und statt des originalen Bildes das skalierte Bild angezeigt.
Das Bild wurde ohne Fehler eingelesen, aber leider war im Programm das Bild nicht zu sehen.
Das skalierte Bild habe ich mit der gleichen Methode eingelesen wie das originale Bild.

Ich habe mir dann ein anderes Verfahren ausgedacht!

Skaliert und im Programm behalten werden nur 100 Bilder ( etwa 30 Bilder unter der Exception Grenze ). Im Programm gibt es also immer nur 100 ImageIcons. Für die Bilder über 100 setze ich deren ImagIcon auf null bevor ich ein neue Bild einlese und skaliere. Da das Programm Bilder löscht, oder umbenennt, werden immer wieder Bilder total aus dem Programm heraus genommen und ich kann das entfernte ImageIcon durch ein neues ImageIcon ersetzen.

Die Idee fand ich super! Aber leider führte sie nicht zum Erfolg!

Bei der gleichen Grenze wie vorher trat die Exception auf, obwohl die Anzahl der, im Programm gehaltenen, ImageIcons konstant bei 100 lag.

Ich habe mal die Verwaltung der ImageIcons protokolliert. Die letzten 5 Ausgaben vor der Exception kopiere ich mal.

[CODE lang="java" title="Protokoll"]
125: vor Icon löschen: javax.swing.ImageIcon@19e64782 nach Icon löschen: null
126: vor Icon löschen: javax.swing.ImageIcon@13725820 nach Icon löschen: null
127: vor Icon löschen: javax.swing.ImageIcon@11070d8c nach Icon löschen: null
128: vor Icon löschen: javax.swing.ImageIcon@401fd345 nach Icon löschen: null
129: vor Icon löschen: javax.swing.ImageIcon@24283bbe nach Icon löschen: null
Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap space
[/CODE]

Vieleicht hilft eine programmierte Garbage Collection??

Fällt Dir was ein?
 

mihe7

Top Contributor
Der GC läuft vorher automatisch. Ich vermute einfach ein Memory Leak, aber ohne Code ist das schwer zu sagen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
P byte Array aus ImageIcon Java Basics - Anfänger-Themen 10
P ImageIcon zusammen mit Fenstergrösse skalieren Java Basics - Anfänger-Themen 3
O ImageIcon, Swing Java Basics - Anfänger-Themen 1
F Interface ImageIcon wird nicht angezeigt Java Basics - Anfänger-Themen 4
R Java ImageIcon drehen Java Basics - Anfänger-Themen 6
F Problem bei ImageIcon aktualisieren Java Basics - Anfänger-Themen 5
P ImageIcon in JAR Java Basics - Anfänger-Themen 5
T Compiler-Fehler Mit Array und "for" mehrere ImageIcon erstellen Java Basics - Anfänger-Themen 7
S GUI ImageIcon Mouselistener Link Java Basics - Anfänger-Themen 0
E Bild vom FileChooser aus via ImageIcon in DB schreiben Java Basics - Anfänger-Themen 16
R JLabel imageicon jede Sekunde wechseln Java Basics - Anfänger-Themen 3
K ImageIcon laden Java Basics - Anfänger-Themen 6
S Button durch ImageIcon ersetzen Java Basics - Anfänger-Themen 9
D JButton oder ImageIcon klickt "langsam" Java Basics - Anfänger-Themen 5
R ImageIcon wird nich angezeigt - Jar, Eclipse Java Basics - Anfänger-Themen 6
P ImageIcon/Pfad Java Basics - Anfänger-Themen 3
C ImageIcon erweitern Java Basics - Anfänger-Themen 6
H ImageIcon rotieren Java Basics - Anfänger-Themen 4
w0ddes ImageIcon in Objektarray (TableModel) einfügen. Java Basics - Anfänger-Themen 7
T ImageIcon ohne Classloader Java Basics - Anfänger-Themen 12
S ImageIcon Array Java Basics - Anfänger-Themen 8
Developer_X eigenes ImageIcon schreiben Java Basics - Anfänger-Themen 11
P ImageIcon Problem Java Basics - Anfänger-Themen 15
B Aus JTable ImageIcon abfragen Java Basics - Anfänger-Themen 8
G ImageIcon Java Basics - Anfänger-Themen 4
D ImageIcon in Label Java Basics - Anfänger-Themen 7
J ImageIcon im JLabel automatisch resizen. Java Basics - Anfänger-Themen 6
G JLabel nachträglich verändern, bzw. ImageIcon ändern? Java Basics - Anfänger-Themen 3
G JPEG aus Blob als ImageIcon anzeigen Java Basics - Anfänger-Themen 5
L ImageIcon an jLabel anpassen? Java Basics - Anfänger-Themen 5
T new JLabel(new ImageIcon("dateiname&pfad.gif") Java Basics - Anfänger-Themen 2
B ImageIcon komprimieren (zB Jpeg) Java Basics - Anfänger-Themen 14
D ImageIcon beschreiben Java Basics - Anfänger-Themen 13
U BufferedImage anzeigen, imageIcon oder paintComponent(); Java Basics - Anfänger-Themen 6
M imageicon aus jar (ja hab die suchfunktion schon benutzt :)) Java Basics - Anfänger-Themen 2
F Tooltips bei ImageIcon in Tabellenspalte Java Basics - Anfänger-Themen 1
X ImageIcon und .exe-Datei Java Basics - Anfänger-Themen 2
K Bildgröße eines ImageIcon verändern Java Basics - Anfänger-Themen 2
L bytestrom in ImageIcon-Objekt umwandeln Java Basics - Anfänger-Themen 3
S Image von ImageIcon anpassen Java Basics - Anfänger-Themen 3
D ImageIcon JApplet Java Basics - Anfänger-Themen 2
Dilandau permission exception bei ImageIcon Java Basics - Anfänger-Themen 6
C Probleme mit Byte konvertieren nach int Java Basics - Anfänger-Themen 10
T IOStreams read(byte[]b) methode Java Basics - Anfänger-Themen 2
I Dateigröße von einem InputStream oder byte[] bekommen Java Basics - Anfänger-Themen 2
krgewb byte-Array, das ein Bild repräsentiert Java Basics - Anfänger-Themen 1
D Best Practice Parameter int vs byte Java Basics - Anfänger-Themen 16
J RSA Verschlüsselung Testen / byte[] in Objekt umwandeln Java Basics - Anfänger-Themen 1
S Byte-Array kann chars speichern? Java Basics - Anfänger-Themen 3
N Datentypen Image zu Byte-Array Java Basics - Anfänger-Themen 4
M Datentypen Byte, Float und Boolean Java Basics - Anfänger-Themen 13
F byte, short oder doch int? Java Basics - Anfänger-Themen 6
S Performance von byte[], short[], int[]..? Java Basics - Anfänger-Themen 24
D Methoden int to byte array und zurück? Java Basics - Anfänger-Themen 5
P int zu byte Java Basics - Anfänger-Themen 8
F Byte Array wachsen lassen Java Basics - Anfänger-Themen 5
M Java Klasse Byte Java Basics - Anfänger-Themen 10
F Byte Ausgabe plötzlich falsch Java Basics - Anfänger-Themen 0
V String in Byte umwandeln Java Basics - Anfänger-Themen 11
O Input/Output Ein (negatives) Byte über PrintWriter hinausschreiben Java Basics - Anfänger-Themen 3
T byte[] zu String mit Sonderzeichen Java Basics - Anfänger-Themen 2
W Nullpointer bei Objekt Serialisierung mit ArrayList<byte[]> etc. Java Basics - Anfänger-Themen 2
J byte - Ausgabe Java Basics - Anfänger-Themen 2
F Teil eines Byte Array an eine Methode übergeben Java Basics - Anfänger-Themen 5
S byte to float Java Basics - Anfänger-Themen 4
J Byte Folge erkennen Java Basics - Anfänger-Themen 5
M sehr großes Byte Array Java Basics - Anfänger-Themen 3
M Byte Array und Co. Java Basics - Anfänger-Themen 12
T Operatoren Float in byte umwandeln Java Basics - Anfänger-Themen 3
Y File to byte[] and byte[] to sysout Java Basics - Anfänger-Themen 3
P Wann Byte-Stream und wann Character-Stream? Java Basics - Anfänger-Themen 11
F Hexfolge in Byte Array ersetzen Java Basics - Anfänger-Themen 8
P String in byte konvertieren, wie? Java Basics - Anfänger-Themen 4
T Erste Schritte Byte Java Basics - Anfänger-Themen 3
R byte[] zu String und Ausgabe Java Basics - Anfänger-Themen 2
H Variablen short <-> byte[] Java Basics - Anfänger-Themen 15
X Datentypen String in byte[] Java Basics - Anfänger-Themen 29
H Variablen 32bit Zählwert als Byte-Array Java Basics - Anfänger-Themen 9
H Variablen string nach byte Java Basics - Anfänger-Themen 12
B Frage zur Effizienz von read und read(byte[]) Java Basics - Anfänger-Themen 23
R Erste Schritte Rechnenoperationen mit byte, short und char Java Basics - Anfänger-Themen 8
V Datentypen Frage zum Datentyp Byte Java Basics - Anfänger-Themen 11
L Byte[] to String, doch bits sind gespiegelt (MSB/LSB) Java Basics - Anfänger-Themen 3
S Von byte[] nach String zurueck nach byte[]. Arrays sind nicht identisch :( Java Basics - Anfänger-Themen 6
S ArrayList<Byte> in String umwandeln Java Basics - Anfänger-Themen 5
V unsigned byte? Java Basics - Anfänger-Themen 27
M byte Array Mindestlänge Java Basics - Anfänger-Themen 19
U short[] nach byte[] Java Basics - Anfänger-Themen 11
D [jni] jbytearray <-> byte array Java Basics - Anfänger-Themen 8
S Datentypen Ändern eines byte[] Arrays Java Basics - Anfänger-Themen 4
B byte-weise Verschlüsselung Java Basics - Anfänger-Themen 6
S Input/Output String in byte umwandeln? Java Basics - Anfänger-Themen 5
F von Byte zu 2 Stellig Hex Java Basics - Anfänger-Themen 3
G byte[] (Base64) korrekt übergeben Java Basics - Anfänger-Themen 4
V Jar-Datei von Byte-Array oder Stream laden? Java Basics - Anfänger-Themen 9
O 64bit- OS byte, short, int oder long bzw. float oder double? Java Basics - Anfänger-Themen 13
G Binär in Byte speichern Java Basics - Anfänger-Themen 7
T Datentypen byte -Division..mal gehts mit cast mal ohne Java Basics - Anfänger-Themen 5
T Datentypen default ist int, cast zu byte nötig... Java Basics - Anfänger-Themen 2
F Byte nach Zahl umwandeln Java Basics - Anfänger-Themen 11

Ähnliche Java Themen

Neue Themen


Oben