En este tutorial veremos una forma para registrar archivos JPG en una base de datos PostgreSQL y recuperarlos para utilizarlos en controles Swing. Como vimos en un tutorial anterior a este donde utilizamos una base de datos MySQL, el procedimiento es prácticamente el mismo, claro con pequeñas diferencias.
¿En que consiste guardar y leer imágenes en una base de datos?
Cuando se desea almacenar fisicamente el contenido de una imagen en una base de datos, este debe ser convertido a una cadena de bytes, para esto el campo donde se guardara la imagen debe ser del tipo BOOL en MySQL y para Postgres tenemos el tipo BYTEA, de esta manera podemos almacenar el contenido de un archivo JPG en la base de datos, ahora para recuperar el contenido de esta imagen y utilizarlo en nuestra aplicación, debemos procesar la cadena de bytes y convertirlo nuevamente en una imagen con la cual podamos trabajar.
Sin más, el tutorial.
Necesitamos
CREATE TABLE imagen ( id character(6) NOT NULL, nombre character(64), archivo bytea )
Proyecto --- Main.java --- imagen.java --- interfaz.java --- postgres.java Bibliotecas --- Driver JDBC PostgreSQL
import java.awt.Image; /** * @web https://www.jc-mouse.net * @author Mouse * CLASE PARA ALMACENAR LOS DATOS DE LA TABLA IMAGEN */ public class imagen { private String id,name; private Image archivo; public Image getArchivo() { return archivo; } public void setArchivo(Image archivo) { this.archivo = archivo; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return this.id+" : "+this.name; } }
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.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.Iterator; import javax.imageio.ImageIO; import javax.imageio.ImageReadParam; import javax.imageio.ImageReader; import javax.imageio.stream.ImageInputStream; import javax.swing.DefaultListModel; /** * @web https://www.jc-mouse.net * @author Mouse * CLASE PARA CONECTARSE A UNA BASE DE DATOS POSTEGRES, INSERTAR Y RECUPERAR IMAGENES JPG */ public class postgres { //DATOS PARA LA CONEXION private String bd = "dbDemoImagen"; private String user = "postgres"; private String password = ""; private String url = "jdbc:postgresql://localhost:5432/dbDemoImagen/"+bd; private Connection connection = null; private ResultSet resultSet = null; private Statement statement = null; //Constructor de clase que se conecta a la base de datoS public postgres() { try{ Class.forName("org.postgresql.Driver"); connection = DriverManager.getConnection(url, user , password); System.out.println("Conectado a la base de datos [ " + this.bd + "]"); }catch(Exception e){ System.err.println(e.getMessage()); } } /* metodo que guarda una imagen JPG en la base de datos * input: ID : identificador unico para el registro, osea primary key * name: nombre de la imagen para reconocerlo mas adelante * ruta: direccion absoluta de la imagen JPG */ public boolean guardarfoto(String id, String name, String ruta) { FileInputStream fis = null; try { File file = new File(ruta); fis = new FileInputStream(file); PreparedStatement pstm = connection.prepareStatement("INSERT into " + " imagen(id, nombre, archivo) " + " VALUES(?,?,?)"); pstm.setString(1, id); pstm.setString(2, name); pstm.setBinaryStream(3, fis,(int) file.length()); pstm.execute(); pstm.close(); return true; } catch (FileNotFoundException e) { System.out.println(e.getMessage()); } catch (SQLException e) { System.out.println(e.getMessage()); } finally { try { fis.close(); } catch (IOException e) { System.out.println(e.getMessage()); } } return false; } /* Metodo que convierte una cadena de bytes en una imagen JPG * input: * bytes: array que contiene los binarios de la imagen * Output: la foto JPG en formato IMAGE */ 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; ImageInputStream iis = ImageIO.createImageInputStream(source); reader.setInput(iis, true); ImageReadParam param = reader.getDefaultReadParam(); return reader.read(0, param); } /* Metodo que extrae los registros de la tabla IMAGEN de la base de datos * crea instancia nueva de la clase imagen.java y añade los datos * agrega estos datos a un DefaultListModel * output: * dml: Es un DefaultListModel que contiene instancia de la clase imagen.java */ public DefaultListModel Lista_Imagenes() { DefaultListModel dml = new DefaultListModel(); try { statement = connection.createStatement(); resultSet = statement.executeQuery("SELECT id,nombre,archivo FROM imagen " ); while (resultSet.next()) { //se crea un objeto CITA y se le van agregando los datos imagen img = new imagen(); img.setId( resultSet.getString("id") ) ; img.setName( resultSet.getString("nombre") ) ; try { //antes de agregar el campo imagen, realiza la conversion de bytes a JPG img.setArchivo(ConvertirImagen(resultSet.getBytes("archivo"))); } catch (IOException ex) { System.err.println(ex.getMessage()); } //por ultimo añade el objeto imagen:img al DefaultListModel dml.addElement(img); } } catch (SQLException ex) { System.err.println(ex.getMessage()); } return dml; } }
import java.awt.Image; import java.text.SimpleDateFormat; import java.util.Date; import javax.swing.DefaultListModel; import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.JFileChooser; import javax.swing.JOptionPane; import javax.swing.filechooser.FileNameExtensionFilter;
private postgres Pg = new postgres(); //Para almacenar la clase imagen private DefaultListModel modListaImagen = new DefaultListModel();
/** Creates new form interfaz */ public interfaz() { initComponents(); this.setTitle("Postreges Imagenes Save/Open [https://www.jc-mouse.net/]"); this.setLocationRelativeTo(null); //se carga los registros de la base de datos Actualizar_lista(); }
//Se conecta a la base de datos y obtiene registros private void Actualizar_lista() { this.modListaImagen.clear(); this.modListaImagen = Pg.Lista_Imagenes(); this.Lista_Imagenes.setModel(modListaImagen); } //Genera un código unico para la imagen private String GenerarCodigo() { SimpleDateFormat sdf= new SimpleDateFormat("hhmmss"); return sdf.format(new Date()); }
private void Lista_ImagenesMouseClicked(java.awt.event.MouseEvent evt) { int index = this.Lista_Imagenes.getSelectedIndex();//obtiene index seleccionado if( index != -1) { //Extrae la clase imagen que corresponde a la posición donde se hizo un clic imagen img = (imagen)this.modListaImagen.getElementAt(index); //redimensiona imagen double alto = img.getArchivo().getHeight(null) / Math.ceil(img.getArchivo().getHeight(null)/300f) ; double ancho =img.getArchivo().getWidth(null) / Math.ceil(img.getArchivo().getWidth(null)/320f) ; Icon icon = new ImageIcon( img.getArchivo().getScaledInstance((int)ancho,(int)alto, Image.SCALE_AREA_AVERAGING) ); this.FOTO.setText(""); this.FOTO.setIcon( icon );//coloca imagen en el JLabel } }
private void jmSaveActionPerformed(java.awt.event.ActionEvent evt) { JFileChooser fileChooser = new JFileChooser(); fileChooser.setFileFilter( new FileNameExtensionFilter("Archivo de Imagen","jpg") ); fileChooser.setCurrentDirectory(new java.io.File("e:/imagenes_tmp/")); int result = fileChooser.showOpenDialog(null); if ( result == JFileChooser.APPROVE_OPTION ){ //obtiene ruta y nombre del archivo String ruta = fileChooser.getSelectedFile().getAbsolutePath(); String name = fileChooser.getSelectedFile().getName(); if( Pg.guardarfoto( GenerarCodigo() , name, ruta ) ) { JOptionPane.showMessageDialog(this,"Imagen ["+name+"] almacenada en la base de datos"); Actualizar_lista(); } } }
Esta aplicacion permite escalar una imagen desde java sin perder las proporciones de la misma, utiliza SCALE_AREA_AVERAG[...]
Xdebug es una extensión para PHP que nos ayuda con la depuración y el desarrollo de aplicaciones. Contiene un depurador[...]
Modelo Vista Controlador (MVC) es un patrón de arquitectura de software que separa los datos de una aplicación, la inter[...]
¿Quien no ha querido programar un juego? creo que la mayoría si no es que todos los que conocen de programación sin impo[...]
En este post iremos conociendo de un modo práctico que es y como se utiliza un Array en java, para esto partiremos de un[...]
¿Qué es Maven? Maven es una herramienta de software para la gestión y construcción de proyectos Java. Provee un conjunto[...]