# BLOB to ImageIcon?



## Juggl3r (21. Okt 2012)

Hallo,

ich will Bilder in meiner Datenbank abspeichern. Das Abspeichern funktioniert auch schon (Hab irgendwo ein Tutorial dazu gefunden), aber dafür schaff ichs grad nicht meine Blob Daten wieder zurück zu einem Image zu konvertieren.........

Hier mein Einfügen Code:

```
blob = conn.createBlob();
ObjectOutputStream oos = new ObjectOutputStream(blob.setBinaryStream(1));
oos.writeObject(bild);
oos.close();
pStmt = conn.prepareStatement("INSERT INTO ***** "
					+ "VALUES(?,?)");

pStmt.setInt(1, ***);
pStmt.setBlob(2, blob);
```

Wobei oben "bild" den Typ ImageIcon hat.

Und jetzt mein Code zum auslesen:


```
pStmt = conn.prepareStatement("SELECT daten FROM Bild WHERE BNummer = ?");
pStmt.setInt(1, bildNummer);
rs = pStmt.executeQuery();
blob = rs.getBlob(1);
ImageIcon i = new ImageIcon();
```

Jetzt weiß ich aber nicht, wie ich meine Blob Daten zum Image umwandeln kann....
Ich hätte es irgendwie so probiert:

ObjectOutputStream oos = new ObjectOutputStream();
oos.writeObject(blob.setBinaryStream(1));
oos.close();

Nur muss ich da beim Erzeugen vom ObjectOutputStream irgendwie das Bild angeben, aber ich seh da nirgends eine Funktion die mir einen OutputStream zurückgibt... Mit ObjectInputStream hab ichs auch nicht hinbekommen.....

edit:
Ich probiers daweil so:


```
img = ImageIO.read(blob.getBinaryStream());
p.setBild(new ImageIcon(img));
```

Problem ist, dass mein ImageIO.read mir ein NULL zurückgibt....

In der Datenbank steht es so:

0	org.hsqldb.types.BlobDataID@138b4ed
1	org.hsqldb.types.BlobDataID@64eff0
2	org.hsqldb.types.BlobDataID@14e54d8

(wobei die erste Spalte die Bildnummer ist). ist das falsch abgespeichert?

Beim oberen Code würde mir  blob.length() die Länge 160254 liefern, aber getBinaryStream gibt mir Stream: org.hsqldb.jdbc.BlobInputStream@1787395 zurück, aber wenn ich darauf Zugreife krieg ich eine NULLPointer Exception...


----------



## Juggl3r (21. Okt 2012)

Unglaublich...
Habs jetzt rausgefunden, falls zufälligerweise irgendjemand anderes auch mal die gleiche Fehlermeldung kriegt........
Ich verwende als Datenbank HyperSQL und in Version 2.0 wird immer eine Exception geworfen, wenn man Blobs einfügen will -.- Nämlich die tolle vielaussagende Exception "lob is no longer valid".
Man muss 2.2.x verwenden, damit es geht......


----------



## Juggl3r (21. Okt 2012)

Hmmm, irgendwie geht es doch nicht -.- Kann mir bitte jemand sagen was ich falsch mache?



```
bild.setDescription("TEST");
			blob = conn.createBlob();
		
			ObjectOutputStream oos = new ObjectOutputStream(blob.setBinaryStream(1));
			oos.writeObject(bild);
		    oos.close();
		    
		    ImageIcon i = new ImageIcon(blob.getBytes( 1L, (int) blob.length() ) );
		    System.out.println("TESTER: " + i.getDescription());
```

Und ich bekomme als Ausgabe NULL. Warum bekomme ich nicht TEST?


----------



## homer65 (21. Okt 2012)

Kann ich leider nicht, da ich ehrlich gesagt nicht verstehe was du da machst.
Wenn du aber an einem funktionierenden Beispiel interessiert bist, kannst dir den JMyScanner von der http://www.edv-ehm.de/ Seite anschauen.
Der scannt Papier ein und speichert dann in einer MySQL Datenbank als Blob. Das auslesen aus der MySQL Datenbank wird auch gemacht.
JMyScanner ist Open Source.


----------

