sql >> Base de Datos >  >> RDS >> Oracle

convertir la imagen en la memoria a un blob

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