Image ist Null - warum?

Thaflasher

Mitglied
Hi Forum,

Java:
public void readByteIntoImage(byte[] b){
		
		ByteArrayInputStream in = new ByteArrayInputStream(b);
		
		try {
			BufferedImage image = ImageIO.read(in);

		} catch (IOException e) {
                   //doanything
			}
}

im oben gezeigten Code versuche ich ein Byte-Array in ein Image einzulesen.
Leider ist das Image immer NULL, obwohl der ByteArrayInputStream die Bytes aus dem übergebenen Array hält (geprüft mit dem Debugger).

Woran könnte das liegen?

Liegt es daran das ich kein neues Objekt BufferedImage erstellt habe?

Dann müsste ich die Bildgröße angeben und die weiss ich nicht das ich alles aus einem Internet/Netzwerk-Stream (Sockets etc) bekomme und es nur häppchenweise einlesen kann/soll. :(

Danke im voraus.
 

Fu3L

Top Contributor
Wann ist es null? Wenn es nach dem try und catch null ist, dann liegt es daran, dass es nur innerhalb des try blocks sichtbar ist. Nach Verlassen des selben ist nur noch eine eventuelle globale image Variable sichtbar. (Ansonsten müsste ein Zugriff auf image sogar einen Compilerfehler auslösen).

Ansonsten fehlt mir das Wissen, um eine andere mögliche Ursache zu erkennen^^
 
V

vanny

Gast
versuch es mal mit ner vorherigen Initialisierung

Java:
public void readByteIntoImage(byte[] b){
        
        ByteArrayInputStream in = new ByteArrayInputStream(b);
        

        BufferedImage image = null;
        try {
             image = ImageIO.read(in);
 
        } catch (IOException e) {
                   //doanything
            }
}
 

Thaflasher

Mitglied
:noe:

Leider ist es nach

Java:
BufferedImage image = ImageIO.read(in);

null.

Bei einer vorherigen Initialisierung mit = null bleibt es null.

Den Schluss den ich daraus ziehen muss ist, das er den Inhalt des ByteArrayInputStreams (BAIS) nicht mit ImageIO.read einliest. Dabei hab ich schon einige Codebeispiele gesehen die das ebenfalls so machen? ???:L
 
Zuletzt bearbeitet:

Thaflasher

Mitglied
Bin jetzt nochmals mit dem Debugger durch.

7 Bytes wurden übergeben und der ByteArrayInputStream beinhaltet 7 Bytes.
Soweit ist es noch in Ordnung.

Habe gerade gelesen, das wenn ImageIO.read() es nicht decodieren kann, dann gibt es null zurück. Schätze das es daran liegt, leider würde mir sonst keine Möglichkeit einfallen 7 Bytes eines Bildes nacheinander einzulesen.

:autsch:

Gibt es eine Möglichkeit an die Informationen eines Bildes zu kommen, also Höhe/Breite, wenn man das Bild nur als Bytes zerlegt bekommen hat?
 

Noctarius

Top Contributor
Was sollen denn 7 Byte für ein Bild sein?

Zu den Bildinformationen:
Schauen wie der Header des Bildformates aussieht, entsprechende Anzahl Bytes einlesen und selber auswerten.
 

Thaflasher

Mitglied
7 Byte sind ein Stück Bild :)

Es geht mir darum nacheinander viele scheibchen Bild einzulesen und am Ende ein ganzes Bild zu haben. Sinn und Zweck ist, das ich schon ein Stück Bild bearbeite während ich ein anderen Stück einlese.

:shock:
Das mit dem Header des Bildformates scheint kompliziert zu sein, da offenbar die Höhe/ Breite nicht immer an der selben Stelle zu stehen scheint (bei JPG).

Gibt es in Java eine Funktion die mir die Bytes umrechnet und die Werte die dahinter stehen zurück gibt?

Sieht so aus als hab ich noch viel Arbeit vor mir. :autsch:
 

Noctarius

Top Contributor
Und wie stellst du dir dann vor, dass Java aus ein paar Byte ohne Header die Images erzeugen kann? Denk mal an einen Brief ohne Betreff und Absender. Da auch nur ein Teil kommt (weil du ja Stück für Stück abarbeiten willst) steht da nur der Satz "Damit ist ja dann vermutlich alles klar".

Wie würdest du daraus ein Sinnvolles Stück Arbeit ableiten? ;)
 

Thaflasher

Mitglied
Nun... ich dachte das es in einer File auch nicht anderst aussieht d.h. das eine lange Reihe von Bytes drin steht und viele kleine Teile ergeben auch eine lange Reihe. :D

Im Hinblick auf eine Parallelisierung wäre das recht nett gewesen da ich gleichzeitig einen Teil des Bildes auslesen kann während bereits ein anderer Teil bearbeitet wird.

Nun der sinnvolle Part ist, das ich gelernt habe das es so nicht möglich ist.

Trotzdem Danke für die Hilfe!
 

Kevin94

Top Contributor
Wie groß sind die Bilder die du bearbeiten möchtest bzw. wie aufwendig ist die Bearbeitung des Bildes, wenn du glaubst, dass die Parallelisierung des Prozesses das ganze Beschleunigen könnte.

Ich denke nicht, dass du in Java auf diese Weise ein zeitintesives Rechenverfahren beschleunigen kannst geschweige den sinnvoll implementieren. Das geht nur mit nativen Code effektiv und darauf wird dein Projekt hinaus laufen, wenn du schon den wenigen µs nachrennst die das einlesen/parsen dauert.

Da du die Dateien offensichtlich aus dem Internet selber lädst würde ich dir empfehlen die paar ms zu warten bis sie kompllet empfangen wurde (wenn es dir darum geht).
Wenn du die Dateien über ein Socket selber lädst per HTTP Request und das entsprechende Response selber parst/einliest kann ich dir nur aus eigener Erfahrung raten nicht darauf zu vertrauen, dass keine Daten mehr kommen, wenn InputStream.available() 0 zurückgibt.
 

Thaflasher

Mitglied
Mein Beispielbild ist 20 kb groß.

Mittlerweile übergebe ich vorher 8 Bytes übergeben damit ich die Größe des Bildes habe. (Quasi als eigener Header).
Die restlichen Bytes welches ich über einen Stream empfange und in ein byte[] speichere, will ich nun mittels BufferedImage in eine File schreiben.
(Übergebe mittlerweile alle Bytes des Bildes)

Da ich immer noch NULL zurück bekomme und der verzweiflung recht nahe bin muss ich doch nochmal fragen:

Gibt es eine Möglichkeit ein JPG-Bild über das Netzwerk / I-Net zu empfangen, in ein Byte Array zwischen zu speichern, und dieses dann anschließend in ein PNG zu konvertieren?

Das Empfangen klappt, die Bytes stehen in einem Byte-Array nur beim Konvertieren crasht es immer, da ich mit IOImage.read(ByteArrayinputstream(byteArray)) gelesen (=null) und mit IOImage.write(BufferedImage, "png", ByteArrayOutputStream) - (crahs wegen image = 0) - konvertiert habe .

Die kritische Klasse sieht mittlerweile so aus :

Java:
public class StreamConverter {
	
	BufferedImage image;
	
	public StreamConverter(int width, int height){
		image = createImage(width,height);
	}
	
	public BufferedImage createImage(int width, int height){
		BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR);
		return image;
	}
	
	public byte[] convertIntoByteArray(byte[] b) throws IOException{
		ByteArrayInputStream in = new ByteArrayInputStream(b);
	
		BufferedImage image = ImageIO.read(in);
		
		ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
		ImageIO.write(image,"png" ,outputStream);

		byte[] c = outputStream.toByteArray();
		outputStream.close();
		return c;
	}


Mit Files funktioniert das lokal ausgezeichnet aber die Vorgabe ist eben das ich von außen die File in Bytes bekomme.

Kann ich die empfangene Datei evtl. beim Empfänger "wiederherstellen"? Dann würde ich sie dort auslesen und in ein anderes Format konvertieren.

Seit 2 Tagen les ich :rtfm: und programmier ich rum aber ich bekomms nicht gebacken das ich am Ende eine File habe. :oops:

Wenigstens hab ich schon ne Menge gelernt.
 
G

Gonzo17

Gast
Schick doch zuerst eine Information wie groß das Bild eigentlich ist (ich meine damit in Bytes), damit weißt du wie groß dein ByteArray sein muss. Dann füllst du es bis es voll ist (keine Ahnung wie lange das bei dir dauert) und erst danach erstellst du ein Image. Vorher macht es ja auch keinen Sinn, denn mit 1/100 von einem Bild kannst du eben kein Objekt für ein Bild erzeugen.
 

Kevin94

Top Contributor
Warum liest du die daten erst in ein byte[] ein, wenn du ImageIO.read direkt einen anderen Stream übergeben könntest, z.B. einen den du von URL.openStream() zurückbekommst, diesen ggf. noch puffern.
 

Thaflasher

Mitglied
Mein ByteArray füllt sich bis nichts mehr kommt.

Java:
ServerSocket srvr = new ServerSocket(1234); //TCP verbindung
         Socket skt = srvr.accept(); //wartet auf conection
         System.out.print("Server has connected!\n");
         byte[] pictureData = new byte[8]; // Breite + Höhe
         byte[] picture = new byte[Byte.MAX_VALUE]; //rest Bild
         int bytecounter = 0;
         skt.getInputStream().read(pictureData);
         par.convertByteIntoHeightandWidht(pictureData); //gibt info´s über breite höhe weiter
         
         while(true){
        	 
        	 bytecounter = skt.getInputStream().read(picture);
        	 
        	 if (bytecounter == -1){
	        	 skt.close();
	             srvr.close();
	             break;
        	 }
        	 else if(bytecounter < picture.length){ //wenn fertig und noch platz: in ein kleineres angepasstes Bytearray schreiben
        		byte[] c = new byte[bytecounter];
        		for (int i = 0; i < c.length; i++) {
					c[i]=picture[i];
				}
        		par.convertByte(c);
        	 }
        	 else{
        		par.convertByte(picture); //ausreichend groß -> weitergeben
        	 }


Mein OutputStream (vorgabe) nimmt nur Byte-Arrays :eek: . Gerade hab ich mich noch gefreut das es eine gute Idee wäre das Image zu versenden. :bahnhof:
 
Zuletzt bearbeitet:

bERt0r

Top Contributor
Ein BufferedImage Objekt besteht ja nicht nur aus den pixeldaten des Bildes sondern hat auch noch andere Information gespeichert. Du kannst nicht einfach aus einem byte-Bruchteil eines Objekts eine ganze Instanz generieren. Wenn du so eine Bruchstückverarbeitung deines Images machen willst, musst du die Daten pixel für pixel übertragen, und dann per Hand zusammenbauen. Das wird aber sicher länger dauern, als einmal das ganze Bild zu senden und dann einmal zu laden.
 
S

Spacerat

Gast
Java:
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.util.Iterator;

import javax.imageio.ImageIO;
import javax.imageio.ImageReader;
import javax.imageio.ImageWriter;
import javax.imageio.stream.ImageInputStream;

public final class JPG2PNG
{
	public static void main(String[] args)
	{
		try {
			File currentDir = new File("./").getAbsoluteFile();
			InputStream in = new URL(currentDir.toURI().toURL(), "yourImage.jpg").openStream();
			File outFile = new File(currentDir.getAbsolutePath() + "/yourImage.png");
			if(outFile.exists()) {
				outFile.delete();
			}
			OutputStream out = new FileOutputStream(outFile);
			write(out, read(in));
			in.close();
			out.close();
		} catch(Throwable e) {
			e.printStackTrace();
		}
	}

	private static BufferedImage read(InputStream in)
	throws IOException
	{
		ImageReader ir = null;
		ImageInputStream iis = ImageIO.createImageInputStream(in);
		Iterator<ImageReader> it = ImageIO.getImageReadersBySuffix("jpg");
    	while(ir == null && it.hasNext()) {
    		ir = it.next();
    	}
    	if(ir != null) {
        	ir.setInput(iis);
        	return ir.read(0);
    	}
    	throw new IOException("no such reader");
	}

	private static void write(OutputStream out, BufferedImage img)
	throws IOException
	{
		ImageWriter iw = null;
		ImageInputStream ios = ImageIO.createImageOutputStream(out);
		Iterator<ImageWriter> it = ImageIO.getImageWritersBySuffix("png");
    	while(iw == null && it.hasNext()) {
    		iw = it.next();
    	}
    	if(iw == null) {
        	throw new IOException("no such writer");
    	}
    	iw.setOutput(ios);
    	iw.write(img);
	}
}
Also dieser Code konvertiert schon mal ein JPG zu einem PNG. "On the Fly" bzw. paketweise wirst es wohl kaum hinbekommen. Die Lese- bzw. Schreibmethode erwarten jeweils einen Stream. Es sollte also so auch kein Problem sein, das konvertierte Bild an eine URL zurück zu schicken, von der man einen gültigen OutputStream bekommt. Beim Fileprotokoll ist das leider nicht der Fall, deswegen habe ich hier mal direkt "FileOutputStream" verwendet.
 

Thaflasher

Mitglied
Es ist 00:08 und der Fehler ist endlich behoben. Der outputstream des Emulators war ein wenig fehlerhaft, so habe ich die bytes von Strings bekommen anstatt der raw bytes. :eek:

Vertraue keinem Prof! :autsch:

Jetzt klappt es auch wenn ich den inputstream vom socket in einen FileInputstream lade und mit einem FileOutputStream schreibe.

Ich danke dem Herrn und diesem Forum das es jetzt endlich läuft. :)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
G Area mit Teil-Image füllen Java Basics - Anfänger-Themen 0
B Image Matching in Memory Minigame Java Basics - Anfänger-Themen 7
J JLabel bzw. Image Icon mit KeyEvent bewgen Java Basics - Anfänger-Themen 9
Butzibu Image Loader lädt nicht alle Bilder: Java Basics - Anfänger-Themen 4
Schniffi Nur bestimmte Bilder aus einem Array auf Image Button anzeigen lassen Java Basics - Anfänger-Themen 3
T Image Icon Java Basics - Anfänger-Themen 3
K File (png) in Image laden Java Basics - Anfänger-Themen 3
M Image löschen Java Basics - Anfänger-Themen 2
G Image in Vordergrund Java Basics - Anfänger-Themen 3
B InputStream (PDF) nach Image (PNG / JPG) konvertieren? Java Basics - Anfänger-Themen 2
S Image Datei selektieren und in Projekt Verzeichnis abspeichern/kopieren Java Basics - Anfänger-Themen 16
N Best Practice Image recognition fuzzy Superhash berechnen Java Basics - Anfänger-Themen 1
H Image laden Java Basics - Anfänger-Themen 4
R Image drehen Java Basics - Anfänger-Themen 1
R Image Teilen Java Basics - Anfänger-Themen 3
B Image laden im GridBagLayout Java Basics - Anfänger-Themen 3
N Image von Resource wird nicht geladen Java Basics - Anfänger-Themen 2
N Datentypen Image zu Byte-Array Java Basics - Anfänger-Themen 4
F Image wird nicht gezeichent?! Java Basics - Anfänger-Themen 21
N Hintergrund image mit .setContentPane Java Basics - Anfänger-Themen 6
W aus Methode auf JLabel zugreifen und Image verändern Java Basics - Anfänger-Themen 1
S buffered image Java Basics - Anfänger-Themen 18
V Scale displayed Image via JCheckBox Java Basics - Anfänger-Themen 1
I Resize Image - Einlesen von InputStream Java Basics - Anfänger-Themen 3
M Image Download klappt nicht mehr Java Basics - Anfänger-Themen 4
Chava Testprojekt.Text.Image.Button Java Basics - Anfänger-Themen 4
S Image nach MausMotion rotieren Java Basics - Anfänger-Themen 7
L Erste Schritte Java Image und Video-Slideshow GUI Java Basics - Anfänger-Themen 3
D Kleinere Positionsangabe als einzelne Pixel bei Image? Java Basics - Anfänger-Themen 28
S Image in Panel laden Java Basics - Anfänger-Themen 12
H Prüfen, ob jpg image schon vorhanden ist, bevor es geladen wird Java Basics - Anfänger-Themen 13
V Image Crawler Java Basics - Anfänger-Themen 3
P Erste Schritte Buffered Image splitten und darstellen Java Basics - Anfänger-Themen 2
P Erste Schritte Image anzeigen in ausführbarer jar mit der Toolkit class Java Basics - Anfänger-Themen 8
T udp -> bytearray -> image -> ausgabe via frame Java Basics - Anfänger-Themen 6
A Image (Bitmap) in String (für XML) Java Basics - Anfänger-Themen 7
F Buffered Image über Socket versenden Java Basics - Anfänger-Themen 6
V Image -> 2D Array (int [][]) Java Basics - Anfänger-Themen 4
L Image laden und auf jPanel ausgeben Java Basics - Anfänger-Themen 7
V FileInputStream auf ein swt.Image Java Basics - Anfänger-Themen 6
A Wie kann man etwas von Typ Image wieder löschen? Java Basics - Anfänger-Themen 7
F Image übertragen und zeichnen Java Basics - Anfänger-Themen 8
G Problem mit Image.IO.read( File ) Java Basics - Anfänger-Themen 3
G Image spiegeln Java Basics - Anfänger-Themen 17
Y Trotz add wird Image in GradBagLayout nicht angezeigt Java Basics - Anfänger-Themen 5
Spin Image helper Java Basics - Anfänger-Themen 6
M Image Metadaten setzen Java Basics - Anfänger-Themen 2
Spin Backgrond Color von Image ermitteln Java Basics - Anfänger-Themen 2
C Image draw... Java Basics - Anfänger-Themen 7
M Image-Icon Ändern Java Basics - Anfänger-Themen 15
J Image upload auf ImageShack,TinyPic usw. Java Basics - Anfänger-Themen 11
R Image laden die Zweite Java Basics - Anfänger-Themen 4
R Image laden Java Basics - Anfänger-Themen 10
M Image zeichenen mit Double Werten Java Basics - Anfänger-Themen 4
B polyline auf buffered image malen Java Basics - Anfänger-Themen 2
G Image to File Java Basics - Anfänger-Themen 4
T Image Position erkennen Java Basics - Anfänger-Themen 6
Spin Image skalieren Java Basics - Anfänger-Themen 2
Spin Background Image Java Basics - Anfänger-Themen 2
K Image / drawImage Java Basics - Anfänger-Themen 2
P Buffered Image, Bereich ausschneiden Java Basics - Anfänger-Themen 3
F Image Editor Java Basics - Anfänger-Themen 2
R Image aus jar laden (dieses mal awt) Java Basics - Anfänger-Themen 19
B Image flimmert Java Basics - Anfänger-Themen 4
Povlsen84 Image exakt erzeugen Java Basics - Anfänger-Themen 5
B Teile einer Image in neue Image kopieren Java Basics - Anfänger-Themen 4
X ARGB Werte auslesen aus Image Java Basics - Anfänger-Themen 2
O Image Loader laedt bild nicht Java Basics - Anfänger-Themen 11
H String to image! Java Basics - Anfänger-Themen 6
H2SO3- image beim awt frame wegmachen Java Basics - Anfänger-Themen 2
M Probleme mit Manifest und Image Java Basics - Anfänger-Themen 2
T Java Bilderverwaltung - Image Fetcher Problem Java Basics - Anfänger-Themen 4
E Image in Datei speichern bzw anzeigen Java Basics - Anfänger-Themen 5
G Image laden Java Basics - Anfänger-Themen 16
O Drag & Drop mit Image? Java Basics - Anfänger-Themen 2
G Image/-Icon wird nicht auf JPanel angezeigt Java Basics - Anfänger-Themen 4
M Image aus JPanel Java Basics - Anfänger-Themen 2
G Kompletten (image) Array löschen Java Basics - Anfänger-Themen 14
P Fileinputstream to image? Java Basics - Anfänger-Themen 3
G Image Problem Java Basics - Anfänger-Themen 5
G Image Java Basics - Anfänger-Themen 3
M draw.Image Java Basics - Anfänger-Themen 11
O Image laden Java Basics - Anfänger-Themen 6
G Image Java Basics - Anfänger-Themen 2
S Image-Datei mit relativem Pfad angeben Java Basics - Anfänger-Themen 3
S Botton und Image kombinieren Java Basics - Anfänger-Themen 3
S import javax.image.io.*; funktioniert nicht Java Basics - Anfänger-Themen 28
D Image drehen Java Basics - Anfänger-Themen 6
DeeDee0815 Uncaught error fetching image Java Basics - Anfänger-Themen 2
A Image erstellen Java Basics - Anfänger-Themen 3
N Grösse eines Image ändern? Java Basics - Anfänger-Themen 4
I Image Dateinformationen auslesen Java Basics - Anfänger-Themen 7
A image uploader applet Java Basics - Anfänger-Themen 10
S image speichern Java Basics - Anfänger-Themen 12
D ImageIO metadata auslesen aus png image Java Basics - Anfänger-Themen 2
G Ausmaße eines Image-Object herrausfinden Java Basics - Anfänger-Themen 4
R Einem Image-Object Alpha-Transparenz hinzufügen Java Basics - Anfänger-Themen 3
S Image in byte[] umwandeln? Java Basics - Anfänger-Themen 2
G Ein Image langsam einblenden und nach 5 Sekunden ausblenden? Java Basics - Anfänger-Themen 10
U Image einlesen Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben