Umwandlung von Bild in der Erinnerung zu einem Blob
Habe ich ein Bild (Typ: java.das awt.Bild) in Erinnerung, ich möchte konvertieren, um ein Blob (Typ: java.sql.Blob) mit dem jdk 1.7.
Alles, was ich finden konnte zu diesem Thema verwendet-streams und-Dateien. Ich brauche sicher nicht brauchen, speichern Sie dieses Bild in eine Datei, bevor Sie in der Lage, es zu konvertieren??
Nicht viel zu zeigen, aber hier folgt ein Beispiel:
import java.sql.Blob;
import java.das awt.Bild;
public GenericResponseType savePhoto(Image image)
{
Connection conn = ds.getConnection();
<< some DB code and assembly of PreparedStatement >>
Blob blob = conn.createBlob();
<< here's where the magic needs to happen I need to get the image parameter to blob >>
//I've tried the following but doesn't quite work as it wants a RenderedImage
//OutputStream os = blob.setBinaryStream(1);
//ImageIO.write(parameters.getPhoto().getImage(), "jpg", os);
pstmt.setBlob(4, blob);
}
Etwas genauer (obwohl ich bezweifle, dass es darauf ankommt, viel) ist, dass die oben generiert wird, mithilfe von web services-JAX-WS WSDL eine operation deklariert, mit MTOM. So erzeugt es eine Signatur mit einem Bild als variable weitergegeben.
- Nein, aber Sie brauchen, um es in ein BufferedImage ersten
Du musst angemeldet sein, um einen Kommentar abzugeben.
java.awt.Image
ist ziemlich einfach. Es bietet keine Mittel, durch welches das image geschrieben werden können/gespeichert, noch gibt es irgendwelche Mittel, um Zugriff auf die zugrunde liegende pixel-Daten des Bildes.Ersten Schritt ist die Umwandlung der
java.awt.Image
zu etwas, dasImageIO
unterstützen können. Dies ermöglicht es Ihnen zu schreiben, die Bilddaten aus...ImageIO
erfordert eineRenderedImage
wie es das primäre Bild-Quelle.BufferedImage
ist die einzige Implementierung dieser Schnittstelle in der Standard-Bibliotheken...Leider gibt es keine einfach Methode für die Konvertierung von einem zum anderen. Glücklicherweise, es ist nicht zu schwer.
Eigentlich nur die Farben der original -
java.awt.Image
auf dieBufferedImage
Als Nächstes benötigen wir speichern das Bild in irgendeiner Weise, so dass es erzeugen kann
InputStream
...Dies ist etwas weniger als optimal, aber bekommt den job getan.
Im Grunde schreiben wir das Bild aus einem
ByteArrayOutputStream
und das Ergebnis verwenden, um zu generieren, eineByteArrayInputStream
Nun. Wenn der Speicher ein Problem, oder das Bild ist ziemlich groß, können Sie zuerst schreiben Sie das abbild auf eine
File
und dann Lesen Sie einfach denFile
zurück über eine Art derInputStream
statt...Schließlich setzen wir die
InputStream
auf die gewünschte Spalte...- Und Blob-dein Onkel...
Versuchen Sie Folgendes: (wahrscheinlich eine viel einfacher Prozess, das war genau das, was ich gefunden nach einer schnellen goolge und kann nicht garantieren, es wird funktionieren - Mads Antwort sieht viel glaubwürdiger).
Bekommen ein BufferedImage (Aus dieser Antwort)
Holen Sie sich ein byte-array (Aus dieser Antwort)
Speichern byte-array als blob (Aus dieser Antwort) (aber sollte wahrscheinlich verwenden Sie eine Vorbereitete Anweisung)