java.awt.Image
är ganska enkelt. Det tillhandahåller inte något sätt på vilket bilden kan skrivas/sparas och det ger inte heller något sätt att få tillgång till underliggande pixeldata i bilden.
Det första steget är att konvertera java.awt.Image
till något som ImageIO
kan stödja. Detta gör att du kan skriva ut bilddata...
ImageIO
kräver en RenderedImage
eftersom det är den primära bildkällan. BufferedImage
är den enda implementeringen av detta gränssnitt inom standardbiblioteken...
Tyvärr finns det ingen enkel metod för att konvertera från den ena till den andra. Lyckligtvis är det inte för svårt.
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();
I grund och botten målar detta bara den ursprungliga java.awt.Image
på BufferedImage
Därefter måste vi spara bilden på något sätt så att den kan producera en InputStream
...
Detta är lite mindre än optimalt, men får jobbet gjort.
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());
I grund och botten skriver vi ut bilden till en ByteArrayOutputStream
och använd resultatet för att generera en ByteArrayInputStream
Nu. Om minnet är ett problem eller om bilden är ganska stor kan du först skriva bilden till en File
och läs sedan helt enkelt File
tillbaka in via någon form av InputStream
istället...
Slutligen ställer vi in InputStream
till önskad kolumn...
PreparedStatement stmt = null;
//...
stmt.setBlob(parameterIndex, bais);
Och Blob är din farbror...