Oracle
 sql >> Database >  >> RDS >> Oracle

convertire l'immagine in memoria in un BLOB

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