mehrere PNG in eine Datei

Status
Nicht offen für weitere Antworten.

MadHatter

Aktives Mitglied
Hi,
ich versuche mehrere PNG Dateien in eine Datei zu schreiben und wieder umgekehrt. Das Schreiben scheint prima zu funktionieren, jedoch nicht wenn ich es wieder lesen möchte. Das erste Bild der Datei kann noch gelesen werden, aber dannach garnix mehr. Am besten schaut ihr euch den Code an:
Code:
{   // SCHREIBEN
            DataInputStream dis = new DataInputStream(new FileInputStream("/home/salim/test/img1.png"));
            BufferedImage buff1 = ImageIO.read(dis);
            dis.close();
            
            dis = new DataInputStream(new FileInputStream("/home/salim/test/img2.png"));
            BufferedImage buff2 = ImageIO.read(dis);
            dis.close();
            
            DataOutputStream dos = new DataOutputStream(new FileOutputStream("/home/salim/test/gesamt"));
            ImageIO.write(buff1, "png", dos);
            ImageIO.write(buff2, "png", dos);
            dos.close();
        }
        {   // WIEDER LESEN
            DataInputStream dis = new DataInputStream(new FileInputStream("/home/salim/test/gesamt"));
            BufferedImage buff1 = ImageIO.read(dis);    // buff1 scheint richtig gelesen zu werden
            BufferedImage buff2 = ImageIO.read(dis);    // buff2 wird hier NULL
            dis.close();
            
            DataOutputStream dos = new DataOutputStream(new FileOutputStream("/home/salim/test/fertig1.png"));
            ImageIO.write(buff1, "png", dos);
            dos.close();
            
            dos = new DataOutputStream(new FileOutputStream("/home/salim/test/fertig2.png"));
            ImageIO.write(buff2, "png", dos);
            dos.close();
        }
Ich benutz hier einfach ein DataInputStream, weil ich das später erweitern möchte, dass er am Anfang der Datei ein Integer liest/schreibt, wieviele PNGs in der Datei enthalten sind. Aber das ist jetzt unwichtig.
Auf jeden Fall fällt mir folgendes auf:
Größe der (Eingabe)Bilder: img1.png = 92,3KB, img2.png = 138,2KB
Größe der Gesamtdatei (ausgabe): gesamt = 299,8KB
Größe der (Ausgabe)Bilder: fertig1.png = 126,0KB, fertig2.png = 0KB natürlich wegen Fehler

Fehlermeldung:
Exception in thread "main" java.lang.IllegalArgumentException: im == null!
at javax.imageio.ImageIO.write(ImageIO.java:1457)
at javax.imageio.ImageIO.write(ImageIO.java:1565)
at Test.main(Test.java:49)

Da fertig1.png > img1.png vermute ich, dass ImageIO vielleicht zu viel liest?
Naja, kann mir jemand bitte bitte helfen?
 
Wie sinnvoll ist es den, die alle in die selbe Datei zu schreiben? Das macht, meiner Meinung nach, keinen Sinn. Pack sie doch über die Klassen aus java.util.zip in ein Archiv (musst es ja nicht als *.zip speichern) oder, noch einfacher, mach mehrere Dateien. Meiner Meinung nach ist das sinnvoller.
 
Also geht das nicht mit Java??? Mit C++ gings...
Für den Sinn brauchst du dir keine Gedanken zu machen. Wofür ich das brauche, und dass ich es überhaupt brauche, soll meine Sache sein. Tut mir leid, ich weiß, dass das nicht nett rüberkommt, aber es stört mich immer, dass in Foren antworten kommen, wie "wozu brauchst du das überhaupt". Wenn es als ZIP ginge, täte ich es so machen, aber ich brauche es so.

Also, ist jemand da, der dieses komische Problem lösen kann?
 
Ok, ich hab das Problem gelöst. Für alle anderen, die mal so ein Problem haben sollten, hier die Lösung:
Zuerst ein ByteArrayOutputStream (baos) erzeugen, und darin über ImageIO das Bild schreiben. Dann lese ich durch das baos wieviele Bytes Platz das Bild nimmt, und schreibe es in die Datei. Dannach schreibe ich die bytes des baos.toByteArray() in die Datei.
Später beim Lesen lese ich wieviele Bytes das Bild groß ist, dann erstelle ich ein so großes byte Array und lese jedes einzelne byte aus der Datei bis es gefüllt ist. Dann erstelle ich ein ByteArrayInputStream mit den Bytes und mache dann ImageIO.read(das_bytearrayinputstream).
Vielleicht gibt es eine bessere Lösung, aber die habe ich bisher noch nicht gefunden...
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben