java.awt.Image
е доста просто. Той не предоставя средства, чрез които изображението може да бъде записано/запазено, нито предоставя средства за получаване на достъп до базовите пикселни данни на изображението.
Първата стъпка е конвертирането на java.awt.Image
към нещо, което ImageIO
може да поддържа. Това ще ви позволи да запишете данните за изображението...
ImageIO
изисква RenderedImage
като основен източник на изображение. BufferedImage
е единственото изпълнение на този интерфейс в библиотеките по подразбиране...
За съжаление, няма просто метод за преобразуване от едно в друго. За щастие, не е твърде трудно.
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();
По принцип това просто рисува оригиналния java.awt.Image
върху BufferedImage
След това трябва да запазим изображението по някакъв начин, така че да може да създаде InputStream
...
Това е малко по-малко от оптималното, но върши работата.
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());
По принцип записваме изображението в ByteArrayOutputStream
и използвайте резултата за генериране на ByteArrayInputStream
Сега. Ако паметта е проблем или изображението е доста голямо, можете първо да запишете изображението във File
и след това просто прочетете File
обратно чрез някакъв вид InputStream
вместо това...
Накрая задаваме InputStream
към необходимата колона...
PreparedStatement stmt = null;
//...
stmt.setBlob(parameterIndex, bais);
А Blob е твой чичо...