Oracle
 sql >> Base de données >  >> RDS >> Oracle

convertir une image en mémoire en un blob

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