Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Konvertieren von Bild im Speicher in ein Blob

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...