java.awt.Image jest po prostu. Nie zapewnia żadnych środków, za pomocą których można zapisać/zapisać obraz, ani nie zapewnia dostępu do podstawowych danych pikseli obrazu.
Pierwszym krokiem jest konwersja java.awt.Image do czegoś, co ImageIO może wspierać. Umożliwi to wypisanie danych obrazu...
ImageIO wymaga RenderedImage ponieważ jest to główne źródło obrazu. BufferedImage jest jedyną implementacją tego interfejsu w domyślnych bibliotekach...
Niestety nie ma prostej metody konwersji z jednego na drugie. Na szczęście nie jest to trudne.
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();
Zasadniczo to po prostu maluje oryginalny java.awt.Image na BufferedImage
Następnie musimy w jakiś sposób zapisać obraz, aby mógł wygenerować InputStream ...
To trochę mniej niż optymalne, ale załatwia sprawę.
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());
Zasadniczo zapisujemy obraz do ByteArrayOutputStream i użyj wyniku do wygenerowania ByteArrayInputStream
Ale już. Jeśli pamięć stanowi problem lub obraz jest dość duży, możesz najpierw zapisać obraz w File a następnie po prostu przeczytaj File z powrotem przez jakiś rodzaj InputStream zamiast tego...
Na koniec ustawiamy InputStream do wymaganej kolumny...
PreparedStatement stmt = null;
//...
stmt.setBlob(parameterIndex, bais);
A Blob jest twoim wujem...