java.awt.Image
es bastante simple. No proporciona ningún medio por el cual la imagen se pueda escribir/guardar ni proporciona ningún medio para acceder a los datos de píxeles subyacentes de la imagen.
El primer paso es convertir java.awt.Image
a algo que ImageIO
puede apoyar. Esto le permitirá escribir los datos de la imagen...
ImageIO
requiere una RenderedImage
ya que es la fuente principal de la imagen. BufferedImage
es la única implementación de esta interfaz dentro de las bibliotecas predeterminadas...
Desafortunadamente, no existe un método simple para convertir de uno a otro. Afortunadamente, no es tan difícil.
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();
Básicamente, esto solo pinta la java.awt.Image
original en la BufferedImage
A continuación, debemos guardar la imagen de alguna manera para que pueda producir un InputStream
...
Esto es un poco menos que óptimo, pero hace el trabajo.
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());
Básicamente, escribimos la imagen en un ByteArrayOutputStream
y el uso del resultado para generar un ByteArrayInputStream
Ahora. Si la memoria es un problema o la imagen es bastante grande, primero puede escribir la imagen en un File
y luego simplemente lea el File
volver a entrar a través de algún tipo de InputStream
en cambio...
Finalmente, configuramos el InputStream
a la columna requerida...
PreparedStatement stmt = null;
//...
stmt.setBlob(parameterIndex, bais);
Y Blob es tu tío...