java.awt.Image
is vrij eenvoudig. Het biedt geen enkele manier waarop de afbeelding kan worden geschreven/opgeslagen en biedt ook geen enkele manier om toegang te krijgen tot onderliggende pixelgegevens van de afbeelding.
De eerste stap is het converteren van de java.awt.Image
naar iets dat ImageIO
kan ondersteunen. Hiermee kunt u de afbeeldingsgegevens wegschrijven...
ImageIO
vereist een RenderedImage
omdat het de primaire afbeeldingsbron is. BufferedImage
is de enige implementatie van deze interface binnen de standaardbibliotheken...
Helaas is er geen eenvoudige methode om van de ene naar de andere te converteren. Gelukkig is het niet zo moeilijk.
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();
Kortom, dit schildert gewoon de originele java.awt.Image
op de BufferedImage
Vervolgens moeten we de afbeelding op de een of andere manier opslaan zodat deze een InputStream
kan produceren ...
Dit is iets minder dan optimaal, maar klaart de klus.
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());
In principe schrijven we de afbeelding naar een ByteArrayOutputStream
en het resultaat gebruiken om een ByteArrayInputStream
. te genereren
Nutsvoorzieningen. Als geheugen een probleem is of de afbeelding vrij groot is, kunt u de afbeelding eerst naar een File
schrijven en lees dan gewoon het File
terug in via een soort InputStream
in plaats daarvan...
Ten slotte stellen we de InputStream
. in naar de gewenste kolom...
PreparedStatement stmt = null;
//...
stmt.setBlob(parameterIndex, bais);
En Blob is je oom...