java.awt.Image
è abbastanza semplice. Non fornisce alcun mezzo con cui l'immagine può essere scritta/salvata né fornisce alcun mezzo per accedere ai dati pixel sottostanti dell'immagine.
Il primo passo è convertire java.awt.Image
a qualcosa che ImageIO
può supportare. Ciò ti consentirà di scrivere i dati dell'immagine...
ImageIO
richiede un RenderedImage
poiché è la fonte dell'immagine principale. BufferedImage
è l'unica implementazione di questa interfaccia all'interno delle librerie predefinite...
Sfortunatamente, non esiste un metodo semplice per la conversione da uno all'altro. Fortunatamente, non è troppo difficile.
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();
Fondamentalmente, questo dipinge semplicemente il java.awt.Image
originale su BufferedImage
Successivamente, dobbiamo salvare l'immagine in qualche modo in modo che possa produrre un InputStream
...
Questo è un po' meno ottimale, ma fa il lavoro.
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());
Fondamentalmente, scriviamo l'immagine in un ByteArrayOutputStream
e utilizzare il risultato per generare un ByteArrayInputStream
Adesso. Se la memoria è un problema o l'immagine è piuttosto grande, puoi prima scrivere l'immagine in un File
e poi leggi semplicemente il File
rientrare tramite una sorta di InputStream
invece...
Infine, impostiamo il InputStream
alla colonna richiesta...
PreparedStatement stmt = null;
//...
stmt.setBlob(parameterIndex, bais);
E Blob è tuo zio...