Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

convertendo imagem na memória para um blob


java.awt.Image é bem simples. Ele não fornece nenhum meio pelo qual a imagem possa ser gravada/salva nem fornece nenhum meio para obter acesso aos dados de pixel subjacentes da imagem.

A primeira etapa é converter o java.awt.Image para algo que ImageIO pode suportar. Isso permitirá que você escreva os dados da imagem ...

ImageIO requer uma RenderedImage como sua fonte de imagem primária. BufferedImage é a única implementação desta interface dentro das bibliotecas padrão...

Infelizmente, não existe um método simples para converter de um para o outro. Felizmente, não é 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();

Basicamente, isso apenas pinta o java.awt.Image original na BufferedImage

Em seguida, precisamos salvar a imagem de alguma forma para que ela possa produzir um InputStream ...

Isso é um pouco menos do que o ideal, mas faz o trabalho.
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());

Basicamente, escrevemos a imagem em um ByteArrayOutputStream e use o resultado para gerar um ByteArrayInputStream

Agora. Se a memória for um problema ou a imagem for muito grande, você pode primeiro gravar a imagem em um File e então simplesmente leia o File de volta através de algum tipo de InputStream em vez de...

Por fim, definimos o InputStream para a coluna necessária...
PreparedStatement stmt = null;
//...    
stmt.setBlob(parameterIndex, bais);

E Blob é seu tio...