BufferedImage performant einlesen

Markey

Mitglied
Hallo zusammen,

ich muss in einem Programm eine ganze Menge von Bildern (JPG) einlesen.
Dafür benutze ich die Klasse ImageIO und speichere die Bilder in einer ArrayList<BufferedImage>.

Mir ist klar dass das Performancetechnisch völliger humbug ist und ich eigentlich die Bilder erst ON-Demand laden sollte. Aber für meine Anwendungszwecke fällt mir leider keine andere Möglichkeit ein.

Selbst das erhöhen des HeapSpace mittels "-Xms1024m -Xmx1024m" hilft nur bedingt.

Zur Erklärung. Ich bin dabei eine Art Photo Mosaik zu programmieren was ein "Zielbild" aus einer Menge von kleinen Bildern zusammensetzt. Ich weiß sowas gibts schon, aber das ist jetzt nicht das Thema.

Dazu ist es erforderlich, dass ich die kleinen Bilder einlese und auf ihren Farb- / Kontrast- und Helligkeitsmittelwert untersuche. Um diese dann in der Folge passend anzuordnen, so dass sie einem vorgegebenen Zielbild entsprechen.

Beispiel: http : // static.gamesports.net/starcraft/picdb/330.jpg
[edit SlaterB: direkte Einbindung eines Mega-Bildes geändert]

Habt ihr ne Idee wie ich der Heap Space Problematik aus dem Weg gehen kann?

Vielen Dank,

Mark
 
Zuletzt bearbeitet von einem Moderator:

carcophan

Mitglied
Vielleicht hilft es wenn du direkt nach dem einlesen eines Bildes es herunterskalierst auf die Ausgabegröße, bevor du sie in die ArrayList schiebst. Oder willst du ein Mosaik aus Bildern in Originalgröße machen?

Oder du behältst zu jeder Zeit nur 2 Images im Speicher: ein eingelesenes Bild und das Zielbild. In einer Map merkst du dir die errechneten Wertes des zuvor eingelesenen Bildes, sowie den Pfad der Bilddatei - anschliessend verwirst du das Bild und lädst das nächste. Nachdem zu alle Bilder analysiert hast, kannst du die Bilder anhand der errechneten Werte (in der Map) sequentiell laden und in das Zielbild schreiben. Somit hast du immer nur 2 Bilder im Speicher: das große Zielbild und das Bild das du berechnen bzw ins Zielbild einfügen möchtest.
 

HimBromBeere

Top Contributor
Lade die Bilder kachelweise ein. Dafür musst du max. die umgebenden Zellen miteinlesen (also höchstens 9Bilder auf einmal + Zielbild), damit du notfalls auch noch Pixeloperationen an den Rändern durchführen kannst. D.h. du iterierst über jede "Zelle" des Zielbildes, holst dir das benötigte Quellbild (und die umgebenden) aus dem Dateisystem und zeichnest es in dein Zielbild.
 

Markey

Mitglied
Danke schonmal für die Antworten!
@HimBromBeere: Das Problem ist nicht das durchlaufen des Zielbildes. Ich erklärs im folgenden nochmal genauer :) Vielleicht verstehe ich es auch nur nicht richtig...

@carcophan
Du meinst das einlesen von den Bildern einfach in mehreren Schüben machen und darauf hoffen dass der Gb bis dahin den Speicher wieder frei geräumt hat? Am Ende hänge ich den aktuellen Code für das einlesen nochmal ran...

Rundumblick nochmal:

Ich habe

Teilbilder (Eine Sammlung von n zufälligen Bildern die später das Mosaik bilden)

Ziebild (Ein einzelnes Bild was durch die Sammlung der Teilbilder abgebildet werden soll)

Ergebnisbild (Das Endprodukt was so aussieht wie das Zielbild und aus der Menge von Teilbildern besteht)

Vom Ablauf her hatte ich mir das wie folgt vorgestellt:

Geplant für das Ergebnisbild sind 40 x 20 Teilbilder die jeweils eine Auflösung von 240 x 120 px haben.
Das Ergebnis verfügt also über insgesamt 800 Teilbilder und hat eine Auflösung von 4800 x 2400 Pixeln.

1. Ich Iterriere durch das Zielbild (40x x 20y Abschnitte)
2. Ich schaue mir den aktuellen Abschnitt des Zielbildes an
und ermittle die vorliegende Durschnittsfarbe (RGB etc.) mit einer Prüfmethode
3. Anhand der ermittelten Farbe soll aus der Liste der Teilbilder ein Bild ausgewählt werden, was am ehesten der vorliegenden Durschnittsfarbe vom aktuellen Zielbildabschnitt entspricht.


Problem:
Das ich das machen kann muss ich doch die Bilder alle schon "eingeladen" und auch durch meine prüfmethode für den Farbmittelwert durchgejagt haben oder?

Jemand ne andere / bessere / funktionierende Idee?

Code-Robau:
Java:
private JFileChooser = new JFileChooser();
[...]


private ArrayList<ImportImage> chooseImageDirectory() {
		ArrayList<BufferedImage> tempList = new ArrayList<BufferedImage>();
		chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
		int returnVal = chooser.showOpenDialog(this);
		if (returnVal == JFileChooser.APPROVE_OPTION) {
			File file = chooser.getSelectedFile();
			File[] files = file.listFiles();
			MimetypesFileTypeMap typ = new MimetypesFileTypeMap();
			for(File f : files)
			{
				if(f.isFile() && f.getName().matches("jpg$"));
				{
					try {
						BufferedImage image = ImageIO.read(f);
						tempList.add(image);
					} catch (IOException e) {
						e.printStackTrace();
					}
				}
			}
		} 
		else {
		}
		return null;
	}
 

Markey

Mitglied
Oder du behältst zu jeder Zeit nur 2 Images im Speicher: ein eingelesenes Bild und das Zielbild. In einer Map merkst du dir die errechneten Wertes des zuvor eingelesenen Bildes, sowie den Pfad der Bilddatei - anschliessend verwirst du das Bild und lädst das nächste. Nachdem zu alle Bilder analysiert hast, kannst du die Bilder anhand der errechneten Werte (in der Map) sequentiell laden und in das Zielbild schreiben. Somit hast du immer nur 2 Bilder im Speicher: das große Zielbild und das Bild das du berechnen bzw ins Zielbild einfügen möchtest.

ahh okay das würde mir die aufwändige objekterzeugung spaaren! Ich verstehe... Reicht mir ja dann wenn ich für jedes Bild den Pfad und meinen Farbmittelwert in einer Map speicher. Manchmal sieht man vor lauter Bäumen den Wald nicht!
 

HimBromBeere

Top Contributor
Das ich das machen kann muss ich doch die Bilder alle schon "eingeladen" und auch durch meine prüfmethode für den Farbmittelwert durchgejagt haben oder?
Ja, das ist wohl wahr, sonst wirst du auf den Bildern keine Berechnungen machen können. Aber du könntest ja auch erstmal für jedes eingeladene Bild die Durchschnittswerte bestimmen und in einer Map speichern, das eigtl. Bild verwirfst du wieder. Erst danach lädst du jede Kachel sukzessive ein.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Mr.Strobel BufferedImage Exportieren Eclipse Java Basics - Anfänger-Themen 14
A BufferedImage zeigt nur schwarz Java Basics - Anfänger-Themen 3
A BufferedImage Pixel Java Basics - Anfänger-Themen 7
pkm Best Practice BufferedImage in JPane darstellen - aber wie? Java Basics - Anfänger-Themen 22
T BufferedImage in Jar Java Basics - Anfänger-Themen 8
C Problem beim laden eines BufferedImage Java Basics - Anfänger-Themen 2
S BufferedImage heller/dunkler machen mit RescaleOp Java Basics - Anfänger-Themen 2
D Jpg in BufferedImage Reader oder Array ablegen? Java Basics - Anfänger-Themen 5
F BufferedImage Speicher Nutzung Java Basics - Anfänger-Themen 2
S BufferedImage Java Basics - Anfänger-Themen 2
Ernesto95 BufferedImage Teilbereich wieder transparent setzen Java Basics - Anfänger-Themen 16
A BufferedImage in Android einbinden - Bild spiegeln -wie? Java Basics - Anfänger-Themen 4
O BufferedImage drehen, falsch positioniert Java Basics - Anfänger-Themen 5
K BufferedImage, Bilder laden Java Basics - Anfänger-Themen 15
H BufferedImage DPI verändern Java Basics - Anfänger-Themen 5
S jpeg bzw bufferedimage als PDF Speichern Java Basics - Anfänger-Themen 13
W von Graphics in BufferedImage Java Basics - Anfänger-Themen 10
H BufferedImage Java Basics - Anfänger-Themen 5
F BufferedImage aus short[][][] Java Basics - Anfänger-Themen 3
Luk10 NPE bei BufferedImage[] Java Basics - Anfänger-Themen 4
S BufferedImage mit farbwerten füllen Java Basics - Anfänger-Themen 11
I Probleme beim Laden eins BufferedImage Java Basics - Anfänger-Themen 8
P BufferedImage als raw speichern Java Basics - Anfänger-Themen 3
C BufferedImage + Popup/Overlay Java Basics - Anfänger-Themen 2
E BufferedImage drucken Java Basics - Anfänger-Themen 3
R BufferedImage in JLabel Java Basics - Anfänger-Themen 2
G Serialisiertes BufferedImage wieder einlesen Java Basics - Anfänger-Themen 13
G Jpanel -> BufferedImage konvertieren Java Basics - Anfänger-Themen 7
G BufferedImage in Applet laden Java Basics - Anfänger-Themen 8
Q BufferedImage aus Bild in jar Java Basics - Anfänger-Themen 2
? BufferedImage löschen Java Basics - Anfänger-Themen 4
F Farben eines ganzen BufferedImage invertieren Java Basics - Anfänger-Themen 2
K Graphics2D und BufferedImage Java Basics - Anfänger-Themen 3
D wie kann ich ein BufferedImage komprimieren? Java Basics - Anfänger-Themen 7
reibi TIFF nach BufferedImage wandeln Java Basics - Anfänger-Themen 72
reibi Farbiges BufferedImage umwandeln zu 2farbig SchwarzWeiss Java Basics - Anfänger-Themen 7
E nullpointer bei BufferedImage Java Basics - Anfänger-Themen 2
M BufferedImage erzeugt OutOfMemoryError Java Basics - Anfänger-Themen 10
B Vorteil von Graphic2D und BufferedImage? Java Basics - Anfänger-Themen 6
U BufferedImage anzeigen, imageIcon oder paintComponent(); Java Basics - Anfänger-Themen 6
X Image nach BufferedImage wandeln ? Java Basics - Anfänger-Themen 9
T BufferedImage kopieren Java Basics - Anfänger-Themen 6
G Image -> BufferedImage Java Basics - Anfänger-Themen 4
M Image/BufferedImage Java Basics - Anfänger-Themen 4
T Multiple BufferedImage Java Basics - Anfänger-Themen 3
R Best Practice Elemente aus ArrayList entfernen (performant) Java Basics - Anfänger-Themen 6
O grosse Textdatei performant als string speichern Java Basics - Anfänger-Themen 8
O Performant große Dateien durchsuchen Java Basics - Anfänger-Themen 8
O Variable Zimmergrößen per scanner einlesen Java Basics - Anfänger-Themen 5
farbenlos Csv Datei in Java einlesen Java Basics - Anfänger-Themen 18
G JTree speichern und wieder einlesen Java Basics - Anfänger-Themen 5
T Text einlesen code was kommt dahin? Java Basics - Anfänger-Themen 1
S SeriellenPort einlesen Java Basics - Anfänger-Themen 3
I XML einlesen und Objekte bekommen Java Basics - Anfänger-Themen 2
M Daten aus .txt Datei einlesen und weiterverarbeiten Java Basics - Anfänger-Themen 80
julian0507 Wörter einlesen lassen und rückwärts ausgeben Java Basics - Anfänger-Themen 7
S JSON einlesen und benutzen Java Basics - Anfänger-Themen 5
A CSv.Datei einlesen und die werte in zweidemosional Int Array speichern Java Basics - Anfänger-Themen 9
I Ical4j / Kalender einlesen von URL - Fehler: "Unparseable date" Java Basics - Anfänger-Themen 16
Saiko Zeilen einer Datei einlesen Java Basics - Anfänger-Themen 3
sserio Txt Datei einlesen Java Basics - Anfänger-Themen 9
D Strings aus Excel-Datei einlesen Java Basics - Anfänger-Themen 2
julian112 Input/Output .gz bzw. .txt Datei Einlesen und Umgang mit Exceptions Java Basics - Anfänger-Themen 1
M String beim einlesen formatieren Java Basics - Anfänger-Themen 12
P Datei einlesen, nach Begriff filtern und in Datei ausgeben. Problem Standardausgabe über Konsole Java Basics - Anfänger-Themen 19
G JSP Textfeld einlesen Java Basics - Anfänger-Themen 2
M Einlesen > new Leser Java Basics - Anfänger-Themen 5
W Werte durch Konsole einlesen Java Basics - Anfänger-Themen 10
A Array einlesen und ausgeben Java Basics - Anfänger-Themen 13
K Datum einlesen und Tag, Monat und Jahr einzeln ausgeben Java Basics - Anfänger-Themen 1
K Datum einlesen und Tag, Monat und Jahr einzeln ausgeben Java Basics - Anfänger-Themen 1
KogoroMori21 Textdatei einlesen im Array (Selection Sort Algorithmus) Java Basics - Anfänger-Themen 3
S Wort einlesen Array ausgeben Java Basics - Anfänger-Themen 4
I Java String einlesen und auslesen Java Basics - Anfänger-Themen 11
A Input/Output Mehrere Csv-Dateien einlesen Java Basics - Anfänger-Themen 2
S CSV einlesen und mit Komma trennen Java Basics - Anfänger-Themen 12
CptK Richtigen Pfad beim einlesen von Datei finden Java Basics - Anfänger-Themen 2
I Java-Wort einlesen und ausgeben Java Basics - Anfänger-Themen 7
J Csv-Datei einlesen Java Basics - Anfänger-Themen 52
JD_1998 Arrays einlesen, zwischenspeichern und wieder ausgeben Java Basics - Anfänger-Themen 8
L Konstruktor für eine Map-Datei/Map-Datei einlesen Java Basics - Anfänger-Themen 5
L Datein einlesen Java Basics - Anfänger-Themen 1
O zufälliges Wort aus einer Datei einlesen Java Basics - Anfänger-Themen 32
E Input/Output Datei anhand von Dateinamen einlesen Java Basics - Anfänger-Themen 5
C Datei über relative Pfade einlesen Java Basics - Anfänger-Themen 6
A Input/Output Dateien einlesen und ausgeben Java Basics - Anfänger-Themen 7
A Klasse um daten zu einlesen Java Basics - Anfänger-Themen 26
A 2d Arrays aus txt.file einlesen Java Basics - Anfänger-Themen 16
A Textdatei mit stream einlesen Java Basics - Anfänger-Themen 2
P Datei einlesen und zurückgeben Java Basics - Anfänger-Themen 5
G String wird nach Einlesen aus Datei nicht erkannt Java Basics - Anfänger-Themen 3
M String in Scanner einlesen Java Basics - Anfänger-Themen 6
E TXT FILE EINLESEN Java Basics - Anfänger-Themen 4
M Einzelzeichen einlesen Java Basics - Anfänger-Themen 2
C (char) Array einlesen Java Basics - Anfänger-Themen 8
B HTML File einlesen inkl. Bilder? Java Basics - Anfänger-Themen 2
E Mehrere Eingabezeilen gleichzeitig einlesen Java Basics - Anfänger-Themen 7
B HTML Datei einlesen und HTML Code in String wandeln Java Basics - Anfänger-Themen 19
V Schleife für das Einlesen von Werten für int Variablen, die Bestandteil von Arrays sein sollen Java Basics - Anfänger-Themen 16
I Nur auf Abfrage von einer Text Datei einlesen Java Basics - Anfänger-Themen 11

Ähnliche Java Themen

Neue Themen


Oben