java.awt.Image
er ret simpelt. Det giver ingen måde, hvorpå billedet kan skrives/gemmes, og det giver heller ikke nogen måde at få adgang til underliggende pixeldata for billedet.
Det første trin er at konvertere java.awt.Image
til noget, der ImageIO
kan støtte. Dette vil tillade dig at skrive billeddataene ud...
ImageIO
kræver et RenderedImage
da det er den primære billedkilde. BufferedImage
er den eneste implementering af denne grænseflade i standardbibliotekerne...
Desværre er der ingen enkel metode til at konvertere fra den ene til den anden. Heldigvis er det ikke for 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();
Grundlæggende maler dette bare det originale java.awt.Image
på BufferedImage
Dernæst skal vi gemme billedet på en eller anden måde, så det kan producere en InputStream
...
Dette er lidt mindre end optimalt, men får arbejdet 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());
Grundlæggende skriver vi billedet ud til en ByteArrayOutputStream
og bruge resultatet til at generere en ByteArrayInputStream
Nu. Hvis hukommelsen er et problem, eller billedet er ret stort, kan du først skrive billedet til en File
og læs derefter File
tilbage via en form for InputStream
i stedet...
Til sidst indstiller vi InputStream
til den ønskede kolonne...
PreparedStatement stmt = null;
//...
stmt.setBlob(parameterIndex, bais);
Og Blob er din onkel...