java.awt.Image
ist ziemlich einfach. Es stellt keine Mittel bereit, mit denen das Bild geschrieben/gespeichert werden kann, noch stellt es Mittel bereit, um Zugriff auf zugrunde liegende Pixeldaten des Bildes zu erhalten.
Der erste Schritt ist die Konvertierung des java.awt.Image
zu etwas, das ImageIO
kann unterstützen. Damit können Sie die Bilddaten ausschreiben...
ImageIO
erfordert ein RenderedImage
als primäre Bildquelle. BufferedImage
ist die einzige Implementierung dieser Schnittstelle innerhalb der Standardbibliotheken...
Leider gibt es keine einfache Methode zum Konvertieren von einem zum anderen. Glücklicherweise ist es nicht zu schwer.
Image img = ...;
BufferedImage bi = new BufferedImage(img.getWidth(null), img.getHeight(null), BufferedImage.TYPE_INT_ARGB);
Graphics2D g2d = bi.createGraphics();
g2d.drawImage(img, 0, 0, null);
g2d.dispose();
Im Grunde zeichnet dies nur das ursprüngliche java.awt.Image
auf das BufferedImage
Als nächstes müssen wir das Bild irgendwie speichern, damit es einen InputStream
erzeugen kann ...
Das ist etwas weniger als optimal, erledigt aber die Arbeit.
ByteArrayOutputStream baos = null;
try {
baos = new ByteArrayOutputStream();
ImageIO.write(bi, "png", baos);
} finally {
try {
baos.close();
} catch (Exception e) {
}
}
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
Grundsätzlich schreiben wir das Bild in einen ByteArrayOutputStream
und verwenden Sie das Ergebnis, um einen ByteArrayInputStream
zu generieren
Jetzt. Wenn der Speicher ein Problem ist oder das Bild ziemlich groß ist, können Sie das Bild zuerst in eine File
schreiben und dann einfach die File
lesen über eine Art InputStream
wieder rein stattdessen...
Schließlich setzen wir den InputStream
in die gewünschte Spalte...
PreparedStatement stmt = null;
//...
stmt.setBlob(parameterIndex, bais);
Und Blob ist dein Onkel...