Foro sobre Java SE > Guardar en mysql objeto Image en campo LongBlob
¿Quieres guardar un Image en un Blob?. Eso es lo que creo entender.
Antes de que contestes, porque creo que te pueden ser muy útiles, te adjunto una colección de métodos, que utilizo para almacenar y recuperar objetos del tipo Image en Blob de SQL. Al usar el tipo Blob me aseguro de que funcione con otras bases de datos, aparte de MySQL, puesto que el almacenamiento en forma de byte[] no está soportado en otras bases de datos, como H2.
public Blob image2Blob(final Image image) throws IOException, SerialException, SQLException, InterruptedException {
return new SerialBlob(imageToByteArray(image));
}
public Image blob2Image(final Blob blob) throws IOException, SQLException {
return byteArrayToImage(getBytes(blob, -1, -1));
}
public Blob getBlob(final byte[] bytes) throws SerialException, SQLException {
return new SerialBlob(bytes);
}
public byte[] getBytes(final Blob blob, final long position, final int length) throws SQLException {
return blob.getBytes(position <= 0 ? 1 : position, length <= 0 ? (int) blob.length() : length);
}
public byte[] imageToByteArray(final Image image) throws IOException, InterruptedException {
return setBufferedToByteArray(imageToBuffered(image));
}
public Image byteArrayToImage(final byte[] bytearray) throws IOException {
return bufferedToImage(setByteArrayToBuffered(bytearray));
}
public Image bufferedToImage(final BufferedImage bufferedImage) {
return Toolkit.getDefaultToolkit().createImage(bufferedImage.getSource());
}
public BufferedImage imageToBuffered(final Image image) throws InterruptedException {
BufferedImage bufferedImage;
if (image instanceof BufferedImage) {
bufferedImage = (BufferedImage) image;
} else {
final int width = image.getWidth(null);
final int height = image.getHeight(null);
// Determine if the image has transparent pixels; for this method's implementation
final boolean hasAlpha = isAlpha(image);
// Create a buffered image with a format that's compatible with the screen
bufferedImage = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration().createCompatibleImage(
width,
height,
hasAlpha ? Transparency.BITMASK : Transparency.OPAQUE);
if (bufferedImage == null) {
// Create a buffered image using the default color model
bufferedImage = new BufferedImage(width, height, hasAlpha ? BufferedImage.TYPE_INT_ARGB : BufferedImage.TYPE_INT_RGB);
}
// Copy image to buffered image
final Graphics graphics = bufferedImage.createGraphics();
// Paint the image onto the buffered image
graphics.drawImage(image, 0, 0, null);
graphics.dispose();
}
return bufferedImage;
}
public byte[] setBufferedToByteArray(final BufferedImage bufferedImage) throws IOException {
byte[] bytearray = null;
if (bufferedImage != null) {
try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
ImageIO.write(bufferedImage, "jpeg", baos);
baos.flush();
bytearray = baos.toByteArray();
}
}
return bytearray;
}
public BufferedImage setByteArrayToBuffered(final byte[] bytearray) throws IOException {
return bytearray == null ? null : ImageIO.read(new ByteArrayInputStream(bytearray));
}
public boolean isAlpha(final Image image) throws InterruptedException {
boolean result;
// If buffered image, the color model is readily available
if (image instanceof BufferedImage) {
result = ((BufferedImage) image).getColorModel().hasAlpha();
} else {
// Use a pixel grabber to retrieve the image's color model;
// grabbing a single pixel is usually sufficient
final PixelGrabber pixelGrabber = new PixelGrabber(image, 0, 0, 1, 1, false);
pixelGrabber.grabPixels();
// Get the image's color model
result = pixelGrabber.getColorModel().hasAlpha();
}
return result;
}
Una manera de obtener una Imagen, a partir de una url, asociada a un Component de Swing, es ésta:
public Image getImage(final Component component, final String imageUrl) throws IOException, InterruptedException {
Image result = null;
final Toolkit toolkit = Toolkit.getDefaultToolkit();
final MediaTracker tracker = new MediaTracker(component);
final URL url = new URL(imageUrl);
url.openConnection().setUseCaches(false);
final Image image = toolkit.createImage(url);
tracker.addImage(image, 0);
tracker.waitForID(0);
if (!tracker.isErrorID(0)) {
result = image;
}
return result;
}
Por supuesto, también se puede usar:
http://docs.oracle.com/javase/7/docs/api/javax/imageio/ImageIO.html#read(java.net.URL)
Sin embargo, el método anterior me ha resultado, en la práctica, más robusto.
Excelente, muchas gracias como siempre.
no logro encontrar la forma de guardar mi objeto Image (donde tengo la imagen entera cargada) y poder agregarla en un campo de la tabla en mysql he probado lo siguiente:
File imagen = new File(unP.getImagenProducto());
FileInputStream fis = new FileInputStream(unP.getImagenProducto());
String sql = "INSERT INTO Producto(ImagenProducto) VALUES (?)";
PreparedStatement stmt = con.prepareStatement(sql);
//Lo convertimos en un Stream
stmt.setBinaryStream(8, fis, (int) imagen.length());
//Asignamos el Stream al Statement
stmt.execute();
Cuando hago el "new FileInputStream(unP.getImagenProducto());" obviamente no anda porque esta esperando una ruta y yo tengo ya la imagen......