java.awt.Image
je docela jednoduše. Neposkytuje žádné prostředky, kterými lze obrázek zapisovat/ukládat, ani neposkytuje žádné prostředky pro získání přístupu k podkladovým pixelovým datům obrázku.
Prvním krokem je převod java.awt.Image
na něco, co ImageIO
může podporovat. To vám umožní vypsat obrazová data...
ImageIO
vyžaduje RenderedImage
jako primární zdroj obrazu. BufferedImage
je jedinou implementací tohoto rozhraní v rámci výchozích knihoven...
Bohužel neexistuje žádná jednoduchá metoda pro převod z jednoho na druhý. Naštěstí to není příliš těžké.
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();
V podstatě to jen vykreslí původní java.awt.Image
na BufferedImage
Dále musíme obrázek nějakým způsobem uložit, aby mohl vytvářet InputStream
...
To je o něco méně než optimální, ale funguje to.
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());
V podstatě zapíšeme obrázek do ByteArrayOutputStream
a výsledek použijte ke generování ByteArrayInputStream
Nyní. Pokud je problém s pamětí nebo je obrázek poměrně velký, můžete obrázek nejprve zapsat do File
a pak si jednoduše přečtěte File
zpět přes nějaký druh InputStream
místo toho...
Nakonec nastavíme InputStream
do požadovaného sloupce...
PreparedStatement stmt = null;
//...
stmt.setBlob(parameterIndex, bais);
A Blob je tvůj strýc...