Visor de Imagenes


Para el visor use un JPanel, sobre el cual se dibuja la imagen, se le aplica un zoom al pulsar el correspondiente boton, mediante el metodo paint(Graphics g).
Esto se logra al llamar a repaint que a su vez llama a paint y este vuelve a pintar la imagen con las nuevas dimensiones.
Ademas agregue la posibilidad de imprimir la imagen mediante la interfece Printable en la clase CuadroImagen, escribiendo el metodo print.
Es bastante basico no obstante para alguien puede servir de ayuda.

CuadroImagen.java



package com.dansan.visor;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.awt.print.PageFormat;
import java.awt.print.Printable;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JPanel;


public class CuadroImagen extends JPanel implements Printable{

 private float zoom;
 private int ancho,alto;
 private BufferedImage bufferImagen;
 private Image imagen,imagenAux;
 private boolean hayFoto = false;
 public CuadroImagen(){
  this.zoom=0;
  this.setBounds(0, 0, 500, 500);
  this.setVisible(true);
  
 }
 
 //metodo que coloca la imagen que va ser dibujada 
 
 public void setImagen(String dirImg){
  this.zoom=0;
  try {
   this.bufferImagen = ImageIO.read(new File(dirImg));
         imagen = bufferImagen;
         imagenAux=imagen;
   hayFoto = true;
         ancho = imagen.getWidth(this);
         alto = imagen.getHeight(this);
         this.resize();
   repaint();
  } catch (IOException e) {
   e.printStackTrace();
  }
 }
 
 //metodo paint que dibuja la imagen en el JPanel
 
 public void paint(Graphics g){
  Graphics2D g2d = (Graphics2D) g;
  if(hayFoto){
         g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
         //se anade la foto
         g2d.translate(this.getWidth() / 2, this.getHeight() / 2);
      g2d.translate(-ancho / 2, -alto / 2);
         g2d.drawImage(imagenAux, 0, 0,ancho, alto, this);
         setOpaque(false);
  }else{
   setOpaque(true);
  }
  super.paintComponent(g2d);
 }
 
 //metodos del zoom
 
 public void aumentar(){
  this.zoom=(float) (this.zoom + 0.10);

  ancho = (int) (imagen.getWidth(this)*(zoom+1));
  alto = (int) (imagen.getHeight(this)*(zoom+1));
  imagenAux = imagen.getScaledInstance(ancho, alto, Image.SCALE_AREA_AVERAGING);
  resize();
  repaint();
  }
 
 public void disminuir(){
  this.zoom= (float) (this.zoom - 0.10);
  ancho = (int) (imagen.getWidth(this)*(zoom+1));
  alto = (int) (imagen.getHeight(this)*(zoom+1));
  imagenAux = imagen.getScaledInstance(ancho, alto, Image.SCALE_AREA_AVERAGING);
  resize();
  repaint();
 }
 
 
 //redimenzionar
 
 
 @SuppressWarnings("deprecation")
 public void resize(){
  this.setPreferredSize(new Dimension(ancho,alto));
  this.resize(ancho, alto);
 }
 
 //metodo de la interface printable

 @Override
 public int print(Graphics g, PageFormat pf, int indexPage)
   throws PrinterException {
  if(indexPage==0){
   g.clearRect(0, 0, this.getWidth(), this.getHeight());
   g.drawImage(imagen, 0, 0, (int)pf.getWidth(),(int) pf.getHeight(), this);
   return Printable.PAGE_EXISTS;
  }else{
   return Printable.NO_SUCH_PAGE;
  }
 }
 
 public void imprimir(){
  PrinterJob job = PrinterJob.getPrinterJob();
  job.setPrintable(this);
  PageFormat pageFormat = new PageFormat();
  pageFormat = job.pageDialog(pageFormat);
  // Diálogo para confirmar impresion.
  // Devuelve true si el usuario decide imprimir.
  if (job.printDialog())
   try {
    job.print();
   } catch (PrinterException e) {
    e.printStackTrace();
   }
 }
}

VentanaPrincipal.java


package com.dansan.visor;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.util.ArrayList;

import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;


public class VentanaPrincipal extends JFrame implements ActionListener{

 private JPanel pOpciones;
 private JButton btnAdel,btnAtras,btnAbrir,btnAumentar,btnDisminuir,btnImprimir;
 private File archivo;
 private CuadroImagen img;
 private JScrollPane scroll;
 private String imagenes[];
 private ArrayList ListaImagenes;
 private String path;
 private int numImg;
 
 
 public VentanaPrincipal(){
  super("Mi visor :-)");
  setSize(600,600);
  setDefaultCloseOperation(EXIT_ON_CLOSE);
  numImg = 0;
  img = new CuadroImagen();
  scroll= new JScrollPane(img,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
  this.add(scroll,BorderLayout.CENTER);
  pOpciones = new JPanel();
  btnAdel = new JButton("-->");
  btnAtras = new JButton("<--");
  btnAumentar = new JButton("+");
  btnDisminuir = new JButton("-");
  btnImprimir = new JButton("Imprimir");
  pOpciones.add(btnAtras);
  pOpciones.add(btnAdel);
  pOpciones.add(btnAbrir);
  pOpciones.add(btnAumentar);
  pOpciones.add(btnDisminuir);
  pOpciones.add(btnImprimir);
  this.add(pOpciones,BorderLayout.SOUTH);
  //listeners
  btnAtras.addActionListener(this);
  btnAdel.addActionListener(this);
  btnAbrir.addActionListener(this);
  btnAumentar.addActionListener(this);
  btnDisminuir.addActionListener(this);
  btnImprimir.addActionListener(this);
  setLocationRelativeTo(null);
  setVisible(true);
 }
 
 //metodo de ActionListener
 
 public void actionPerformed(ActionEvent e) {
  if(e.getSource()==btnAdel){
   numImg++;
   if(numImg>=ListaImagenes.size())numImg=0;
   img.setImagen(path+"/"+ListaImagenes.get(numImg));
  }else if(e.getSource()==btnAtras){
   numImg--;
   if(numImg<0)numImg=ListaImagenes.size() - 1;
   img.setImagen(path+"/"+ListaImagenes.get(numImg));
  }else if(e.getSource()==btnAbrir){
   JFileChooser jfc = new JFileChooser();
   int apr = jfc.showOpenDialog(this);
   if(apr==jfc.APPROVE_OPTION){
    archivo = jfc.getSelectedFile();
    imagenes = archivo.getParentFile().list();
    ListaImagenes = new ArrayList<String>();
    for(String img:imagenes){
     if(this.esImagen(img)){
      ListaImagenes.add(img);//cargo solo las imagenes
     }
    }
    path = archivo.getParent();
    img.setImagen(archivo.getAbsoluteFile().toString());
   }
  }else if(e.getSource()==btnAumentar){
   img.aumentar();
  }else if(e.getSource()==btnDisminuir){
   img.disminuir();
  }else if(e.getSource()==btnImprimir){
   img.imprimir();
  }
 }//funciones getter y setter

 public File getArchivo() {
  return archivo;
 }


 public void setArchivo(File archivo) {
  this.archivo = archivo;
 } 
 
 //Comprueba que solo cargue las imagenes
 
 public boolean esImagen(String dirImg){
  if(dirImg.lastIndexOf(".jpg")>0||dirImg.lastIndexOf(".png")>0||dirImg.lastIndexOf(".gif")>0||dirImg.lastIndexOf(".jpeg")>0){
   return true;
  }
  return false;
 }
 
}

Main.java


package com.dansan.visor;

public class Main {

 
 public static void main(String[] args) {
  VentanaPrincipal vp = new VentanaPrincipal();
 }

}

Diagrama generado con ObjectAid

Imagenes del visor ejecutandose




La Descarga

https://drive.google.com/file/d/0B0sBXdZ8aJgdeDIwbUJXU3lmNTg/edit?usp=sharing

Para ejecutar en el directorio del archivo tipear:

java -jar visor.jar


Comentarios

  1. Si deseara mostrar en una etiqueta que este arriba del visor el nombre de la foto que estoy visualizando en ese momento como podria hacerlo!

    ResponderBorrar
  2. Hola Daniel, muchas gracias por publicar este código...

    ResponderBorrar
  3. Hola, podrias pasar el proyecto? Soy principiante y no consigo ejecutarlo.

    ResponderBorrar

Publicar un comentario