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...