Capturar webcam con VB.NET

¿Que haremos? Crearemos una aplicación en Visual Studio, la cual hará uso de una webcam para capturar el video en frames independientes y depositarlos en memoria para despues mostralos al usuario a través de un picturebox y un Timer para crear la ilusión de movimiento. ¿Porque lo haremos? Porque es justo y necesario ¿Que necesitamos? [...]

Envío de correo con JavaMail/Netbeans

JavaMail es una expansión de Java que facilita el envío y recepción de e-mail desde código java. JavaMail implementa el protocolo SMTP (Simple Mail Transfer Protocol) así como los distintos tipos de conexión con servidores de correo -TLS, SSL, autentificación con usuario y password, etc [Según SantaWikipedia] ¿Qué necesitamos? JavaMail 1.4.5 Java y Netbeans 6.9 [...]

Proyecto de base de datos Firebird VB

En este proyecto realizaremos una aplicación de base de datos Firebird con el lenguaje de programación de Visual Basic de Microsoft, este proyecto tendrá las funciones básicas de gestión INSERT, DELETE, UPDATE y una interfaz de usuario para utilizarlas. ¿Que necesitamos? Visual Studio 2008 o superior Firebird última versión Firebird ADO.NET Data Provider. Conocimientos básicos [...]

Imprimir imagen con Print

La siguiente clase hace uso de PRINT para imprimir una imagen que se encuentra en un variable de tipo FileInputStream, esta clase a su vez es implementada desde una interfaz que hace fácil su uso, la clase así como todo el proyecto esta comentado. import java.io.File; import javax.print.Doc; import java.io.IOException; import javax.print.DocFlavor; import javax.print.SimpleDoc; import java.io.FileInputStream; [...]

Code Army Bolivia

5/12/09

Cargar imagenes en java + mysql con netbeans

JAN29


Investigando un poco la manipulacion de imagenes en base de datos, la introduccion previa conversion a una cadena de bytes en la base de datos no necesito de mucha ciencia, pero el problema se presento cuando se necesita leer la imagen guardada y mostrarla en un entorno grafico, soluciones hay varias pero yo me incline por leer la cadena de bytes convertirla en imagen y cargarla en un objeto JLabel, todo esto en memoria, en ningun momento se guarda la imagen leida fisicamente en la pc como lei en otros sitios. No se si el codigo que te presento a continuacion sea optima, lo que si se es que hace lo que debe hacer.

Empezemos.

Antes de seguir con este tutorial te sugiero que te des una vuelta por el anterior post "Guardar imagen en MySQL con Netbeans" ya que dare por entendido un par de cosas.

Paso 1: Insertaremos previamente unas cuantas imagenes en la base de datos, en la tabla "fotos". Esto nos servira mas adelante para probar la interfaz.

Paso 2: Modificaremos nuestra clase fotoclass.java, añadiendo dos metodos mas getfoto() y convertirImagen(). ambos metodos se encuentran explicados en el codigo fuente.

package imagen;
import java.awt.Image;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.*;
import java.util.Iterator;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.imageio.ImageReadParam;
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;
/**
 * @web http://jc-mouse.blogspot.com
 * @author mouse
 */
public class fotoclass {
    conectate con;
    private Image data;
    
  public fotoclass (){
    con = new conectate();
  } 
      
public void guardarfoto(String nombre, String foto) {
        {
            FileInputStream fis = null;
            try {
                File file = new File(foto);
                fis = new FileInputStream(file);

                PreparedStatement pstm = con.getConnection().prepareStatement("insert into " + 
                        " fotos(nombre, foto) " + " values(?,?)");
                pstm.setString(1, nombre);                
                pstm.setBinaryStream(2, fis,(int) file.length());
                pstm.execute();
                pstm.close();
            } catch (FileNotFoundException ex) {
                Logger.getLogger(fotoclass.class.getName()).log(Level.SEVERE, null, ex);
            } catch (SQLException e) {
                System.out.println(e);
            } finally {
                try {
                    fis.close();
                } catch (IOException ex) {
                    Logger.getLogger(fotoclass.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }
   }

//metodo  que dado un parametro "id" realiza una consulta y devuelve como resultado
// una imagen
 public Image getfoto(String id){         
      try{    
         PreparedStatement pstm = con.getConnection().prepareStatement("SELECT " +
            " foto " +
            " FROM fotos " +
            " where id = ? ");
         pstm.setString(1, id);
         ResultSet res = pstm.executeQuery();
         int i = 0;
         while(res.next()){
            //se lee la cadena de bytes de la base de datos
            byte[] b = res.getBytes("foto");
            // esta cadena de bytes sera convertida en una imagen
            data = ConvertirImagen(b);            
            i++;
         }
         res.close();
          } catch (IOException ex) {
            Logger.getLogger(fotoclass.class.getName()).log(Level.SEVERE, null, ex);
        }catch(SQLException e){
         System.out.println(e);
    }        
    return data;     
 }
 
 //metodo que dada una cadena de bytes la convierte en una imagen con extension jpeg
 private Image ConvertirImagen(byte[] bytes) throws IOException {
    ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
    Iterator readers = ImageIO.getImageReadersByFormatName("jpeg");
    ImageReader reader = (ImageReader) readers.next();
    Object source = bis; // File or InputStream
    ImageInputStream iis = ImageIO.createImageInputStream(source);
    reader.setInput(iis, true);
    ImageReadParam param = reader.getDefaultReadParam();
    return reader.read(0, param);
 } 
}


Paso 3: Agregaremos a nuestro proyecto en netbeans "imagen" un nuevo JFrame al que llamaremos fotoform.java con la siguiente distribucion:


Paso 4: En el source de nuestro fotoform declaramos

fotoclass  f = new fotoclass();

Paso 5: Agregamos el evento MouseClicked al objeto cmdCargar y añadimos el siguiente codigo:


 private void cmdCargarMouseClicked(java.awt.event.MouseEvent evt) {
        // TODO add your handling code here:
        String cod = txtID.getText();
        Image dtCat = f.getfoto(cod);
        Icon icon = new ImageIcon(dtCat);
        lbFoto.setIcon(icon);
    }

el objeto txtID captura el codigo de la imagen que queremos ver, pasa como parametro a getfoto() la cual la transforma a imagen y esta imagen la utilizamos en el objeto jLabel: lbFoto.

El resultado:

24 comentarios:

Unknown dijo...

hola bueno muy buen aporte .. solo tengo una duda en esta linea

Iterator readers = ImageIO.getImageReadersByFormatName("jpeg");

como vemos esta leyendo un jpeg pero que pasa si la imagen que lee tiene otro formato por ejemplo gif

bastaría con cambiar así

Iterator readers = ImageIO.getImageReadersByFormatName("gif");

peor si tengo esos dos formatos en mi bd o asta mas .... como lo haría ??? esa es mi duda

aa y otra era como hago para q la imagen salga con el tamaño del label (lblFoto) no de su tamaño original

desde ya muchas gracias

Mouse dijo...

Hola, vamos por partes dijo jack el destripador :)

1. respecto a la primera pregunta, es correcto, el objeto BLOB almacena bytes y los bytes de un archivo JPG, GIF, PNG son diferentes y por tanto no se puede reconstruir un GIF de un JPG a menos que cambies los bytes y esto solo te complicaria las cosas.

Por tanto te aconsejo que utilices una "bandera" osea al guardar imagenes en la base de datos, por ejemplo para la tabla IMAGEN(id, nombre, foto, tipo); el campo FOTO almacena los bytes, y el campo TIPO, almacena el tipo de imagen que guardaras, asi al reconstruir la imagen puedes hacer uso de esta bandera para utilizar uno u otro tipo de extension.

Iterator readers = ImageIO.getImageReadersByFormatName("jpeg");
Iterator readers = ImageIO.getImageReadersByFormatName("gif");

2. respecto al tamaño de la imagens te recomiendo utilizar la propiedad "getScaledInstance" del objeto IMAGE.

por ejemplo para el codigo de este post:
/*este codigo carga la imagen en el label*/
String cod = txtID.getText();
Image dtCat = f.getfoto(cod);
Icon icon = new ImageIcon(dtCat);
lbFoto.setIcon(icon);

cambialos a:

String cod = txtID.getText();
Image dtCat = f.getfoto(cod);
//crea un nuevo objeto IMAGE y escalalo
//donde ANCHO y ALTO son las dimensiones de la nueva imagen, por ejemplo las de tu objeto jLabel
Image i = dtCat.getScaledInstance(ANCHO,ALTO, Image.SCALE_AREA_AVERAGING);
Icon icon = new ImageIcon(i);
lbFoto.setIcon(icon);

espero te sirva la ayuda y gracias por pasarte por mi blog

juan dijo...

te felicito por el blog, la verdad que está muy completo y variado.
Saludos para Bolivia desde Uruguay

Anónimo dijo...

Hola Amigo antes que todo te felicito por tu blog, sabes quisiera que me ayudes con una duda al enviar a guardar una imagen est se lo hace en bytes
¿Que tamaño seria aconsejable guardar la imagen? xq segun tengo pensado una vez pasado a bytes este tiende a pesar mucho, en especial cuando va en una columna de una tabla de una base datos mysql...
Desde ya muchas GRACIAS...
Mi correo:
reneguido_18@hotmail.com

Anónimo dijo...

Hola jcMouse ayudame en esta por fa:
En este programa tu devuelves un objeto imagen , esta bien, hasta ahi estamos bien, yo hago lo mismo solo que lo paso a un bufferedimage, y cuando intento cargar la imagen me aparece una pantalla negra, todo esta bien el programa no me sale ningun error, pero no se si es que no estoy haciendo algo bien, gracias si me respondes te agradeceria

Mouse dijo...

Reneguido:
muy tarde la respuesta, pero aqui esta, el tamaño con la que guardes tu imagen en la base de datos, depende del uso que le quieras dar, por otro lado, cuando pasas una imagen a bytes para MySQL, este no crece.

Mouse dijo...

Anonimo :), si te muestra una imagen negra, eso quiere decir que la imagen se creo, pero en el proceso, la imagen no se formo correctamente, no conosco tu codigo para poder ayudarte, lo siento

si utilizas mi codigo, veras que un procedimiento, se convierte de los bytes a imagen no a bufferedImage, ahora para pasar de Image a BufferedImage, es mas complicado. Mira este enlace, ahi tienes un ejemplo de como convertir a BufferedImage

http://www.exampledepot.com/egs/java.awt.image/image2buf.html

saludos

Anónimo dijo...

muy bueno el aporte .....pero tengo una pregunta ¿sera ke teniendo una cadena de texto la puedo combertir en una imagen y esta imagen llevarlo aun reporte????.gracias de antemano

Unknown dijo...

Una Idea para cargar las imagenes de formatos Gif y Jpg.

Iterator readers;
try {
readers = ImageIO.getImageReadersByFormatName("jpeg");
}catch(Exception ex){
readers = ImageIO.getImageReadersByFormatName("gif");
}

phantroc dijo...

una duda haber si me la puedes solucionar jlabel1.getIcon();
te devuelve un Icon pero el Icon no lo puedo guardar por que solo se Guarda los Image, convertir de Image a Icon ya se pero de Icon a Image es el problema no se si sabes espero tu respuesta

Ar13l dijo...

me gustaria saber como se ouede poner una vez obtenida la imagen en una pagina jsp

Mouse dijo...

Ar131:

pues igual como esta en el tuto, al extraer la imagen de la base de datos se esta conviertiendo esta en un IMAGE, este objeto lo asignas a un control.

Ar131 dijo...

Lo que he intentado es ponerlo en una etiqueta img pero no me da la imagen, me podes hacer el favor de decirme como asignar una imagen a un control para que se vea en la pagina...

y gracias por este ejemplo me ha ayudado mucho

Senju dijo...

o ye amigo esta genial tu código, ya que yo estoy desarrollando algo similar, mira mi duda es que si con tu código podría adaptarse para que pudiera mostrarme mas de una imagen ya que ese es uno de mis problemas ya que en tu código solo mostrara la primer imagen que encuentre en la bd, con ese código de la fotografía que pusiste, no se si al haber vas de dos fotografías con el mismo código lo pudieras mostrar. esa es mi duda. agradecería mucho tu ayuda

Anónimo dijo...

hola , si yo guardo la url de la imagen en un jtextfield y lo inserto con una sentencia sql , este no se envia como imagen solo la ruta. y java no reconoce las barras \\ . me podes dar algun consejo.

mouse dijo...

o.O claro que no se envia si estas guardando la ruta solamente.

cuando guardas la ruta completa de l a imagen , para asignar esta a un componente debes pasarle la url

si guardas los bytes de la imagen, como se hace en este ejemplo, debes convertirlo a image y asignarlo al control

BAN dijo...

Hola disculpa que te moleste pero tengo un problemilla...
Resulta que grabo varias imagenes en mi base de datos (formato jpg y jpeg) y todas estas imagenes que guardo deseo cargarlas en unos labels en mi interfaz.
El numero de labels que se crea debe ser el mismo que de imagenes, pero estas pueden ir aumentando o disminuyendo no son fijas :(.

como podria hacerlo?? ademas de que me sale este error cuando intento convertir las imagenes que recupero de la base de datos: java.util.NoSuchElementException

Desde ya muchas gracias por la ayuda

Unknown dijo...

Amigo Mouse me podrias ayudar de como guardar una imagen y consultarla pero no en base de datos sino desde una carpeta,, ??? porfavor si?
osea de un JTextField digito un codigo y me traiga la imagen en un JLabel pero que la jale desde una carpeta en Disco duro podrias???
te lo agradeceria inmensamente

mouse dijo...

esto te puede ayudar
http://www.jc-mouse.net/base-de-datos/consultas-con-parametros-en-access-y-java

Unknown dijo...

HOLA JCMOUSE MIRA COMO HAGO PARA VER ARCHIVOS EN COREL DRAW Y/O ILUSTRATOR EN UN PANEL O UN LABEL EXISTE ESA POSIBILIDAD?????
BUENO Y ANTE TODO FELICIDADES POR TU BLOG ESTA MUY BUENO Y SALUDOS DESDE PERU

mouse dijo...

la unica solucion seria buscar APIS de terceros, hasta donde se creo que con photoshop se podia

cesar ortiz dijo...

Excelente aporte.... me a sido muy util

Anónimo dijo...

Muy bueno el blog estoy haciendo algo similar, pero me gustaria hacer una carga masiva de imagenes desde un jsp como lo podría hacer...?

wormandrade dijo...

Hola Buen día, tu ayuda por favor.
Quiero recuperar una imagen q esta guardada en una base de SQL Server, y el campo es tipo image, para compararla con otra que se lee por escaner.

Post recomendado