Mehrere PNG-Files in einer Datei

hk

Bekanntes Mitglied
Hallo Forum,
ich habe mehrere PNG-Files in einer Datei zusammengefasst. Damit ich sie wiederfinde habe ich vor jeden PNG-Header ein paar Bytes (mit der Länge der PNG-Daten) eingefügt. Soweit so gut.
Mein Problem ist nun, wie bekomme ich die mit DataInputStream gelesenen Daten - um meinen Header bereinigt - in ein Datenformat welches ich an ein Image() übergeben kann,
lg heinz
 
K

kneitzel

Gast
Also ich bin mir nicht so sicher, ob dies so Sinn macht, aber das kann man natürlich auch einlesen:
- Du öffnest die Datei mit einem RandomAccessFile -> https://docs.oracle.com/javase/9/docs/api/java/io/RandomAccessFile.html
- Dann liest Du die ersten Bytes mit der Größe und springst hinter das Bild, bis Du bei Deinem Bild angekommen bist.
- Dann liest Du die Größe des Bildes
- Dann erstellst Du ein byte-Array mit dieser Größe und liest das Bild ein.
- Dann erstellst Du auf dem Array ein ByteArrayInputStream ->https://docs.oracle.com/javase/9/docs/api/java/io/ByteArrayInputStream.html

Damit hast Du dann ein Stream, welchen Du fürs Einlesen des Bildes nutzen kannst, z.B. mittels ImageIO.read.

Aber das ist halt kein übliches Vorgehen. Für dieses "Zusammen packen" von mehreren Dateien in eine einzelne Datei finden sich genug interessante Ansätze: ZIP und JAR fallen mir da direkt ein, was das Java Framework direkt unterstützt: https://www.codejava.net/java-se/file-io/how-to-compress-files-in-zip-format-in-java
(Und das ist ein Vorgehen, dass aktiv angewendet wird - z.B. Office Formate von Microsoft um ein Beispiel zu nennen.)

Wenn das aber Dateien sind, die Du nicht als User-Dateien / Dokumente lesen und schreiben willst sondern statt dessen Bilder, die Du mit dem Programm mitlieferst: Dann packst Du die als Ressourcen in das jar File und liest diese über den ClassLoader.
 

hk

Bekanntes Mitglied
Also ich bin mir nicht so sicher, ob dies so Sinn macht, aber das kann man natürlich auch einlesen:
- Du öffnest die Datei mit einem RandomAccessFile -> https://docs.oracle.com/javase/9/docs/api/java/io/RandomAccessFile.html
- Dann liest Du die ersten Bytes mit der Größe und springst hinter das Bild, bis Du bei Deinem Bild angekommen bist.
- Dann liest Du die Größe des Bildes
- Dann erstellst Du ein byte-Array mit dieser Größe und liest das Bild ein.
- Dann erstellst Du auf dem Array ein ByteArrayInputStream ->https://docs.oracle.com/javase/9/docs/api/java/io/ByteArrayInputStream.html

Damit hast Du dann ein Stream, welchen Du fürs Einlesen des Bildes nutzen kannst, z.B. mittels ImageIO.read.

Aber das ist halt kein übliches Vorgehen. Für dieses "Zusammen packen" von mehreren Dateien in eine einzelne Datei finden sich genug interessante Ansätze: ZIP und JAR fallen mir da direkt ein, was das Java Framework direkt unterstützt: https://www.codejava.net/java-se/file-io/how-to-compress-files-in-zip-format-in-java
(Und das ist ein Vorgehen, dass aktiv angewendet wird - z.B. Office Formate von Microsoft um ein Beispiel zu nennen.)

Wenn das aber Dateien sind, die Du nicht als User-Dateien / Dokumente lesen und schreiben willst sondern statt dessen Bilder, die Du mit dem Programm mitlieferst: Dann packst Du die als Ressourcen in das jar File und liest diese über den ClassLoader.
 
K

kneitzel

Gast
Also wenn Du auf ZIP Files wechseln möchtest, dann musst Du nicht den Weg über ein byte Array + ByteArrayInputStream gehen.

Du hast doch schon eine Instanz vom ZipInputStream und damit einen InputStream. Den kannst Du direkt mit ImageIO.read nutzen. Du musst also nur zu dem gewünschten Eintrag gehen um dann aus diesem Stream zu lesen. Der Umweg mit dem ByteArrayInputStream war bei mir nur gewählt, um da einen Stream zu haben, der begrenzt ist und genau die gewünschte Menge liest bis zum nächsten Eintrag.

Das wäre prinzipiell auch nicht notwendig, denn Du könntest auch Deinen eigenen InputStream schreiben, der auch von Eintrag zu Eintrag springt ähnlich dem ZipInputStream und beim lesen aus dem Stream am Ende des Eintrags endet.
 

hk

Bekanntes Mitglied
Das mit dem ZIP-File hat nun geklappt.
Da das ImageIO.read aber nur ein BufferedImage erstellt und sich ein BufferedImage nicht in ein Image konvertieren lässt - welches ich für den ListView benötige - habe ich eine Konvertierung in ein WritableImage gefunden welches ListView-fähig ist.
 
K

kneitzel

Gast
Das mit dem ZIP-File hat nun geklappt.
Da das ImageIO.read aber nur ein BufferedImage erstellt und sich ein BufferedImage nicht in ein Image konvertieren lässt - welches ich für den ListView benötige - habe ich eine Konvertierung in ein WritableImage gefunden welches ListView-fähig ist.
Du arbeitest mit JavaFX? Da ist dann java.awt.* nicht wirklich der Namespace, den man nutzen möchte. Das ist aber eine Abhängigkeit, die jetzt neu ist :)

Das JavaFX Image hat aber auch einen Konstructor, der ein InputStream nimmt und das Bild lädt. Daher ist hier auch keine Umwandlung notwendig und ich würde dazu raten, java.awt.* generell nicht zu nutzen in einer JavaFX Anwendung.

Damit ersparst Du dir auch eine Umwandlung über WriteableImage (Ich nehme an, du erzeugst ein solches in der gleichen Größe um dann mit zwei Schleifen alle Punkte im BuffeerdImage zu lesen und im WriteableImage zu setzen... Damit hast Du doppelten Speicherverbrauch und natürlich die Laufzeit dafür ...)
 

hk

Bekanntes Mitglied
Das JavaFX Image hat aber auch einen Konstructor, der ein InputStream nimmt und das Bild lädt. Daher ist hier auch keine Umwandlung notwendig und ich würde dazu raten, java.awt.* generell nicht zu nutzen in einer JavaFX Anwendung.
Ja ich arbeite mit JavaFX und habe nun den Image-Konstruktor der einen InputStream akzeptiert gefunden. Nun sieht es recht sauber aus.
Danke nochmals
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
L Mehrere .Jar Files aufrufen Allgemeine Java-Themen 9
A Problem: Mehrere PDF-Files nacheinander Öffnen Allgemeine Java-Themen 12
G mit javac in Console mehrere java Files compilieren Allgemeine Java-Themen 6
I Mehrere Klassen mit den selben Daten Allgemeine Java-Themen 5
berserkerdq2 Ist es schlechter Programmierstyle mehrere Panes aufeinander zu machen? Allgemeine Java-Themen 1
Tarrew OpenAPI Schnittstelle - Mehrere Kunden mit unterschiedlichen Zugriffsrechten Allgemeine Java-Themen 2
A Mehrere for-Schleifen Allgemeine Java-Themen 2
M Mehrere Sounds Allgemeine Java-Themen 3
M Mehrere Ressourcen in einem package ablegen Allgemeine Java-Themen 1
Avalon DTO aus mehrere Entitäten erstellen Allgemeine Java-Themen 5
H Mehrere Datentypen in einer Arraylist speichern Allgemeine Java-Themen 9
Curtis_MC Collections Liste anhand mehrere Kriterien sortieren Allgemeine Java-Themen 6
bueseb84 Git : Mehrere Server verwenden Allgemeine Java-Themen 3
L mehrere Methoden Allgemeine Java-Themen 19
W Variablenübergabe über mehrere Klassen Allgemeine Java-Themen 4
B StAX Parser - mehrere Methoden, ein XML Allgemeine Java-Themen 4
T String mehrere Worte Allgemeine Java-Themen 2
N Bei Mouse Events nicht mehrere Objekte erstellen Allgemeine Java-Themen 13
J Variablen Mehrere int-variablen in txt abspeichern und danach wieder auslesen Allgemeine Java-Themen 1
S JTable - mehrere ausgewählte Rows in ArrayList Allgemeine Java-Themen 5
H Java FX 2 Fragen um Programm in mehrere sprachen zu übersetzen in Gluon Framwork Allgemeine Java-Themen 3
F Listen - Mehrere Objekte Allgemeine Java-Themen 1
R Variable durch mehrere Methoden ändern und nutzen Allgemeine Java-Themen 17
S libGDX mehrere Texturen zu Einer zusammenfassen Allgemeine Java-Themen 0
X Mehrere booleans in Datei Speichern, Updaten und Laden Allgemeine Java-Themen 1
OnDemand CSV parsen mehrere Zeilen Allgemeine Java-Themen 22
K Mehrere Programmiersprachen gleichzeitig lernen Allgemeine Java-Themen 3
C Mehrere Seiten drucken in Hoch- und Querformat Allgemeine Java-Themen 0
perlenfischer1984 Mehrere Komponenten erstellen Allgemeine Java-Themen 3
F AWT Mehrere Tastatureingaben verarbeiten Allgemeine Java-Themen 5
J Mehrere Wörter getrennt in eine Array einlesen, wie ? Allgemeine Java-Themen 7
HarleyDavidson Best Practice Integer-Zahlenfolge über mehrere Programmstarts Allgemeine Java-Themen 7
F Mehrere JTables' drucken Allgemeine Java-Themen 0
2 mehrere Json Werte Parsen Allgemeine Java-Themen 3
stylegangsta Mehrere html seiten einer Homepage einlesen und als Textdatei ausgeben Allgemeine Java-Themen 14
P Mehrere Java Versionen auf dem Rechner Allgemeine Java-Themen 3
B JAVA - mehrere Clienten gleichzeitig starten. Nicht bei Code! Allgemeine Java-Themen 3
S PrintWriter.println() schreibt mehrere Zeilen Allgemeine Java-Themen 19
2 Mehrere Uhrzeiten Sortieren Allgemeine Java-Themen 2
T Jsoup: Mehrere Links nacheinander parsen Allgemeine Java-Themen 11
T Schlüsselworte mehrere public-Klassen in einem Paket Allgemeine Java-Themen 7
E Lesen von mehrere Csv-Datei und ihre Inhalte vergleichen Allgemeine Java-Themen 3
K GUI-Entwicklung - Dispose, enabling und mehrere Controller Allgemeine Java-Themen 1
M Eclipse Mehrere Threads, mehrere Konsolen Allgemeine Java-Themen 4
A Threads Lock über mehrere Abschnitte in verschiedenen Methoden Allgemeine Java-Themen 5
H Mehrere Bilder aus einer Datei lesen Allgemeine Java-Themen 2
B Mehrere Objekte verschlüsselt serialisieren Allgemeine Java-Themen 6
S Tool um mehrere Klassen in einer Klasse vereinen? Allgemeine Java-Themen 6
K Mehrere Arrays auf einmal erstellen Allgemeine Java-Themen 2
R ListIterator über mehrere Arrays Allgemeine Java-Themen 13
J JFreeChart - Mehrere X-Achsen Einteilungen Allgemeine Java-Themen 3
S Mehrere Shapes "malen" Allgemeine Java-Themen 3
M Input/Output Mehrere Bilder aus Resourcen auslesen Allgemeine Java-Themen 8
J Erste Schritte Mehrere Mauszeiger für Ping Pong Game Allgemeine Java-Themen 7
P Mehrere MP3s abspielen Allgemeine Java-Themen 3
M Mehrere CRLF entfernen Allgemeine Java-Themen 13
F Mehrere Threads - ein Stack Allgemeine Java-Themen 6
K Mehrere JVMs die auf eine Klasse mit statischen Variablen zugreift Allgemeine Java-Themen 19
B JUnit und mehrere Instanzen der selben Applikation Allgemeine Java-Themen 4
G mehrere Threads starten/stoppen Allgemeine Java-Themen 4
A Email versenden mehrere Zeilen Allgemeine Java-Themen 10
D Mehrere String-Werte in eine Tabellen-Zelle schreiben Allgemeine Java-Themen 8
R JTree - Mehrere Roots Allgemeine Java-Themen 6
Beckenbauer Mehrere Paragraphe in eine Word Datei schreiben Allgemeine Java-Themen 4
H Mehrere Anwendungen von Java kontrollieren lassen Allgemeine Java-Themen 10
T Edit: JLabel+MouseListener oeffnet mehrere Instanzen Allgemeine Java-Themen 5
O split mit einem ODER mehrere Tabulatoren oder Leerzeichen Allgemeine Java-Themen 6
M JFreeChart mehrere PieCharts erstellen Allgemeine Java-Themen 2
S Wie kann ein Observer mehrere Observables beobachten? Allgemeine Java-Themen 9
T Synchronisation von Listen bei Zugriffen durch mehrere Prozesse Allgemeine Java-Themen 15
D befehl auf mehrere objekte anwenden Allgemeine Java-Themen 7
B mehrere services in einem client Allgemeine Java-Themen 10
Meldanor Speichern der Datenbank - Lohnen sich mehrere Threads? Allgemeine Java-Themen 2
G Process - mehrere Commands?! Allgemeine Java-Themen 2
O Mehrere Exemplare(Kopieen) drucken Allgemeine Java-Themen 2
S log4j Logging über mehrere Klassen Allgemeine Java-Themen 13
F 1 Key - mehrere Values Allgemeine Java-Themen 3
G JOGL mehrere GLCanvas erstellen Allgemeine Java-Themen 2
S Mehrere Listen ineinander verschachteln Allgemeine Java-Themen 22
P Java3D mehrere Ebenen parallel zu yz-Ebene Allgemeine Java-Themen 9
R mehrere jar Dateien kompinieren Allgemeine Java-Themen 14
P Mehrere Instanzen der selben Appl. verhindern Allgemeine Java-Themen 12
M Scanner-Methode: Mehrere Eingaben mit Exception behandeln Allgemeine Java-Themen 10
I Wie kann ich mehrere Mp3 Tags ausgeben? Allgemeine Java-Themen 6
I Mehrere MP3 Dateien einlesen? Allgemeine Java-Themen 3
G String.replaceall - mehrere Zeichen durch eines ersetzen Allgemeine Java-Themen 5
C ArrayList sortieren (mehrere Kriterien) Allgemeine Java-Themen 6
N mehrere klassen extenden Allgemeine Java-Themen 33
G Oracle will mehrere hundert Produkte patchen Allgemeine Java-Themen 5
F Logger in mehrere Dateien mit log4J Allgemeine Java-Themen 4
W Properties-Klasse: mehrere Parameter-Belegungen übergeben? Allgemeine Java-Themen 2
Daniel_L Mehrere (XML-)Datei aus einer ZIP-Datei auslesen Allgemeine Java-Themen 4
V Mehrere main() in jar, wie starten? Allgemeine Java-Themen 4
D Mit Linux mehrere Kommandos in einem Subprozeß Allgemeine Java-Themen 3
D Suche sowas wie Map nur für mehrere Werte Allgemeine Java-Themen 13
V JFilechooser, mehrere Datein selektieren und Reihenfolge? Allgemeine Java-Themen 2
G mehrere Threads verwalten? Allgemeine Java-Themen 14
K Applet dass auf mehrere Bibliotheken zugreift Allgemeine Java-Themen 13
F mehrere Verzeichnisse als Parameter Allgemeine Java-Themen 15
G mehrere url's in ein array (problem mit // ) Allgemeine Java-Themen 7

Ähnliche Java Themen

Neue Themen


Oben