java.awt.Image
est assez simple. Il ne fournit aucun moyen par lequel l'image peut être écrite/sauvegardée ni aucun moyen d'accéder aux données de pixel sous-jacentes de l'image.
La première étape consiste à convertir le java.awt.Image
à quelque chose qui ImageIO
peut soutenir. Cela vous permettra d'écrire les données de l'image...
ImageIO
nécessite un RenderedImage
comme source d'image principale. BufferedImage
est la seule implémentation de cette interface dans les bibliothèques par défaut...
Malheureusement, il n'y a pas de méthode simple pour passer de l'un à l'autre. Heureusement, ce n'est pas trop 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();
Fondamentalement, cela peint simplement l'original java.awt.Image
sur BufferedImage
Ensuite, nous devons enregistrer l'image d'une manière ou d'une autre afin qu'elle puisse produire un InputStream
...
C'est un peu moins qu'optimal, mais ça fait le travail.
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());
Fondamentalement, nous écrivons l'image dans un ByteArrayOutputStream
et l'utilisation du résultat pour générer un ByteArrayInputStream
À présent. Si la mémoire est un problème ou si l'image est plutôt volumineuse, vous pouvez d'abord écrire l'image dans un File
puis lisez simplement le File
retour via une sorte de InputStream
à la place...
Enfin, nous définissons le InputStream
à la colonne requise...
PreparedStatement stmt = null;
//...
stmt.setBlob(parameterIndex, bais);
Et Blob est ton oncle...