Bilder effizient speichern/serialisieren

marioschluse

Mitglied
Hallo Leute,

nachdem ich nun mit Hilfe Bilder in mein Java Projekt anzeigen konnte,
stellt sich das nächste problem:

Ich hab Objekte, die eine ArrayList<Image> enthalten.
Wenn ich diese Objekte realisiere, entsteht eine viele größere Datei, als die Bilder
alle zusammen eigentlich haben sollten....

Wie kann man effizienter Objekte mit Bildern abspeichern?

Vielen Dank
 

Marco13

Top Contributor
Vermutlich beziehst du dich mit der "Größe, die die Bilder eigentlich haben sollten" auf die Größe einer JPG- oder PNG-Datei. Ein Bild der Größe w*h belegt aber mindestens w*h*4 bytes (kannst ja mal schauen, ob das etwa hinkommt). Abilfen: Bilder als JPG oder PNG speichern, oder die Daten noch Zippen (was aber (ggf. deutlich) weniger bringen würde)
 

marioschluse

Mitglied
Ja, das mit der Berechnung hat hin.
Als JPG abspeichern möchte ich vermeiden.
Weil ein Objekt evt. sehr viele Bilder haben könnte...

In google hab ich etwas von BufferArray gelesen.
Hat jemand damit erfahrung?
Dauert dafür das umwandeln von BufferArray zu BufferdImage und dann zu Image nicht lange???
 

Marco13

Top Contributor
Was soll "BufferArray" denn sein?
Tatsächlich ist es schwer, vorherzusagen, was schneller ist
- Ein 5 MB großes Bild als reine Daten schreiben oder
- Ein 5 MB großes Bild mit JPG auf 500kb runterrechnen und DIE dann schreiben.
 

Guybrush Threepwood

Top Contributor
Du könntest die Bilder in byte-Arrays umwandeln und diese serialisieren. Ich habe das einmal bei einem Programm gemacht, das viele kleine PNGs verwendete. Die entstehende Datei war etwa 40% kleiner als der Platz, den die PNGs auf der Platte eigenommen haben. Ich habe das aber eher aus kosmetischen Gründen gemacht, um nicht so viele Einzeldateien zu haben. Hier ein bisschen Code zum Serialisieren und Deserialisieren:

Java:
	/**Serialize array of BufferedImages to file
	 * @param file
	 * @param images
	 * @throws IOException
	 * @throws ClassNotFoundException
	 */
	public static void serializeImages(String file, String[] images) throws IOException, ClassNotFoundException{
		ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(file));
		byte[] imageInByte;
		for(int i = 0; i < images.length; i ++){
			BufferedImage originalImage = ImageIO.read(new File(images[i]));
			ByteArrayOutputStream baos = new ByteArrayOutputStream();
			ImageIO.write(originalImage, "png", baos);
			baos.flush();
			imageInByte = baos.toByteArray();
			baos.close();
			out.writeObject(imageInByte);
		}
		out.close();
	}

Die Funktion liest die Dateien (Übergabe in Form eines String-Arrays) von der Platte und speichert sie in eine Datei.

Java:
	/**Retrieve list of images from serialized image file
	 * @param file
	 * @return ArrayList with BufferedImages
	 * @throws IOException
	 * @throws ClassNotFoundException
	 */
	public static ArrayList<BufferedImage> deserializeImage(String file) throws IOException, ClassNotFoundException{
		ArrayList<BufferedImage> imageList = new ArrayList<BufferedImage>();
		FileInputStream fs = new FileInputStream(file);
		ObjectInputStream in = new ObjectInputStream(fs);
		boolean eof = false;
		try {

			while (!eof) {
				byte[] b = (byte[])in.readObject();
				InputStream in2 = new ByteArrayInputStream(b);
				imageList.add(ImageIO.read(in2));
				in2.close();
			}
		} catch (EOFException e) {
			eof = true;
		}

		in.close();
		fs.close();

		return imageList;
	}

(Ja, ich weiß, man sol nicht ArrayList verwenden und stattdessen eine List zurück geben; ist mir aber egal bei meinem Anwendungszweck). Also nun noch einmal richtig: Die Funktion liest die serialisierte Datei ein und gibt die Bilder als ArrayList<BufferedImage> zurück.

Vielleicht nützt es Dir etwas.
 

marioschluse

Mitglied
Ups,
ich meinte natürlich Byte-Array XD

Vielen Dank für dein Code, mir geht's nämlich auch um "kosmetischen" Gründen.
Ich werd dein Code die Tage auf jedenfall ausprobieren ^^
 
S

Spacerat

Gast
@GuyBrush: Und wieso dieser Aufwand mit ImageIO? Bilddatei in ein Bytearray lesen und ByteArray serialisieren. ImageIO wird so erst beim Deserialisieren notwendig. Der Nachteil aber wäre, dass sich dann evtl. auch andere Bildtypen (oder ähnlich Wildes) in dem ObjectStream befinden könnten. Z.B. auch GIFs, die gleich aus mehreren Bildern bestehen könnten.
BTW.: Was haltet ihr vom Multiple-Image Network Graphics Fileformat? Wär's nicht schön, wenn es dafür auch einen Writer gäbe? Ich finde immer nur 'nen Reader.
 
S

Spacerat

Gast
[ot]
Hat von MNG und APNG ( Animated Portable Network Graphics ? Wikipedia ) eigentlich schon ein Format "gewonnen"?
Was heisst gewonnen? Ist etwa Krieg? APNG erfreut sich bereits eines weiter reichenden Supports als MNG, ist nur leider nichts Offizielles. Frage mich, warum sich die PNG-Group so wehement dagegen wehrt, diese zusätzlichen Tags in ihr Format aufzunehmen. Die Begründung, für Animationen ein eigenes Format haben zu wollen, ist doch hirnrissig (bedeutet letztendlich nur mehr Arbeit für mich :(). Den Beweis dafür liefert wohl MNG-VLC... dass ich nicht Lache. Datentypen wachsen nunmal mit ihren Versionsnummern. Mir würde dabei im übrigen ein einziger Datentyp, den man um was auch immer erweitert, vollkommen ausreichen. Aber nee... jeder Hinz und jeder Kunz macht's anders und das gilt für das Erstellen einer neuen Ansammlung von Bitfolgen (Datentyp) ebenso wie für die dafür existierenden Reader und Writer.[/ot]
 
S

Spacerat

Gast
[OT]Ich kenn' zwar das Problem, aber die Karikatur nicht. Aber genau das ist meiner Meinung nach der der falsche Ansatz. Es ist nichts gegen neue Formate einzuwenden, solange sie etwas neues bieten. Bestehende Formate in ein neues standardisierteres Format pressen zu wollen, ist hirnrissig. Kein Mensch wird die neuen Formate lesen können, wenn kein Reader dafür vorhanden ist (BTW.: das ist Standard :lol:). Ebenso ist es willkommen, wenn bestehende Formate in ihren Versionsnummern aufsteigen, um zukünftig neuere Technologien zu unterstützen, man bräuchte dann nur noch die Reader geringfügig ändern (BTW.: wusstest du, dass man für z.B. RIFF-WAVE, AIFF, 8SVX und AVI prinzipiell die selben Lesemechanismen verwenden kann? Aber neee, RIFF-WAVE ist - bzw. war es damals zumindest - was neues von MS und hat mit EA-IFF recht wenig zu tun. :bloed:). Dann noch die Sache mit den Lizenzgebühren für wirklich neue Sachen. Wie soll das gehen? "Ihr macht unser neues Format zum Standard und bezahlt uns dafür."? :bloed: Und dann ständig diese Fragen (nicht zuletzt hier im Forum): "Wie kann ich Datei N in Umgebung Q verwenden?" die Antwort darauf müsste demnach lauten: "Gar nicht! Diese Trottel, die dieses wunderbar 'neue' Format entwickelten, haben an seiner Verbreitung (Etablierung) eigentlich gar kein Interesse, weil sie Lizenzgebühren erheben. Nimm ersatzweise eines dieser Millionen Standardformate oder wechsle die Umgebung, achte aber darauf, dass Umgebung und Format kompatibel sind." :bloed: Krieg sieht anders aus, da gibt's Gewinner und Verlierer. Diese Konstellation hier aber ist reiner Bullshit, denn es gewinnt keiner. Standards setzt der Anwender - zumindest sollte es so sein.[/OT]
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Bilder werden unscharf angezeigt Spiele- und Multimedia-Programmierung 5
S Bilder Für Schachfiguren Spiele- und Multimedia-Programmierung 14
beatles Minesweeper - keine Bilder Spiele- und Multimedia-Programmierung 3
P [Spiel]Welche Bilder sind gleich Spiele- und Multimedia-Programmierung 2
O Bilder senden TV über DLNA? Spiele- und Multimedia-Programmierung 0
T Bilder Elegant darstellen... Spiele- und Multimedia-Programmierung 7
T Bilder einbinden, bzw. ändern Spiele- und Multimedia-Programmierung 5
M Bilder in Java Spiele- und Multimedia-Programmierung 7
D Slick Lib - Bilder einlesen funktioniert nicht Spiele- und Multimedia-Programmierung 2
B Bilder in GUI ändern ohne repaint() Spiele- und Multimedia-Programmierung 6
T Spielautomat bilder vergleichen Spiele- und Multimedia-Programmierung 34
A Bilder werden nicht geladen Spiele- und Multimedia-Programmierung 6
S Datenbank gesucht für Bilder(gif-dateien) Spiele- und Multimedia-Programmierung 5
A Bilder (auf JPanels) auf komplette Zellengröße (GridBagLayout) skalieren Spiele- und Multimedia-Programmierung 2
I Bilder aus Quaxli's Tutorial Spiele- und Multimedia-Programmierung 3
A bilder performant und unhässlich skalliert darstellen? Spiele- und Multimedia-Programmierung 10
A 2 Bilder übereinander legen Spiele- und Multimedia-Programmierung 15
J 2D-Bilder in Java3D Spiele- und Multimedia-Programmierung 4
A Bilder(BMP) speichern Spiele- und Multimedia-Programmierung 2
S Bilder zuscheiden - Werte von php übergeben Spiele- und Multimedia-Programmierung 7
D Bilder besser interpolieren Spiele- und Multimedia-Programmierung 4
F Dynamische Bilder erzeugen? Spiele- und Multimedia-Programmierung 7
R Bilder aus animierter .gif extrahieren? Spiele- und Multimedia-Programmierung 4
C jpg.Bilder teilen/bearbeiten für Puzzle Spiele- und Multimedia-Programmierung 7
A Bilder bewegen Spiele- und Multimedia-Programmierung 2
M Bilder verzerren [Rechteck -> Trapez] Spiele- und Multimedia-Programmierung 4
K Bilder drehen Spiele- und Multimedia-Programmierung 5
H Bilder speichern 2 - Methode richten? Spiele- und Multimedia-Programmierung 2
H Bilder speichern Spiele- und Multimedia-Programmierung 3
A Bilder flackern Spiele- und Multimedia-Programmierung 5
T Gekachelte Bilder darstellen Spiele- und Multimedia-Programmierung 2
M Welt möglichst effizient malen... Spiele- und Multimedia-Programmierung 7
T Effizient zeichnen Spiele- und Multimedia-Programmierung 12
C Speichern von Daten mit Mysql Spiele- und Multimedia-Programmierung 4
J Fertigungstechnik.. PLS HALP.. Quellcode vom Text in java-Klasse speichern Spiele- und Multimedia-Programmierung 2
Devil0s 2D Stadt Generator/2D Welt speichern OHNE Tiles Spiele- und Multimedia-Programmierung 5
N [SLICK] Rectangle in Array Speichern Spiele- und Multimedia-Programmierung 3
M MJPEG Stream aufnehmen (Speichern und von VirtualDub weiterverarbeiten lassen). Spiele- und Multimedia-Programmierung 2
A Speichern un Laden mit Serializable Spiele- und Multimedia-Programmierung 4
B Daten speichern: Reflexion vs Serializable Spiele- und Multimedia-Programmierung 8
A PNG pixelweise/blockweise speichern? Spiele- und Multimedia-Programmierung 2
F Programm für Bildbearbeitung gesucht: Skalieren und Speichern Spiele- und Multimedia-Programmierung 6
Y Jede Aktion sofort speichern Spiele- und Multimedia-Programmierung 5
aze Java 3D : 3D Objekte speichern und später wieder einlesen Spiele- und Multimedia-Programmierung 9
H Speichern und Öffnen von einem Zeichenprogramm Spiele- und Multimedia-Programmierung 4
S benutzerdefiniertes Tileset in Datei speichern Spiele- und Multimedia-Programmierung 3
J Zeichnen in BufferedImage und dieses in Datei speichern Spiele- und Multimedia-Programmierung 2
M Jpanel Graphik speichern Spiele- und Multimedia-Programmierung 6
H Jpeg Bildinformation in ein Char Array speichern? Spiele- und Multimedia-Programmierung 4
U JPG in größe ändern und speichern Spiele- und Multimedia-Programmierung 3
G highscore in *.dat speichern! Spiele- und Multimedia-Programmierung 8
S Inhalt von Canvas3D als jpg - File speichern Spiele- und Multimedia-Programmierung 2
K Java2d Bild als JPG oder so speichern Spiele- und Multimedia-Programmierung 10

Ähnliche Java Themen

Neue Themen


Oben