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