viernes, 18 de enero de 2013

Ajustar una imagen al tamaño de un JLabel en Java

Recuerdo en una ocasión cuando en la universidad llevé la asignatura de Estructura de Datos me tocó programar un juego, para ello yo utilizaba un JLabel en el cual cargaba una imagen, pero con algunas imágenes tenía problemas ya que éstas no se veían completamente porque eran muy grandes en comparación del JLabel; o por el contrario sobraba espacio en el JLabel ya que la imagen era demasiado pequeña para éste.

De cualquier manera una solución muy práctica a este problema es redimensionar la imagen en cuestión de tal manera que ésta se ajuste al tamaño del JLabel. Para ello desarrollaremos un pequeño ejemplo el cual carga una imagen que no cabe en un JLabel; el programa también dispondrá de un botón con la etiqueta "escalar" que contendrá el código que permitirá ajustar, redimensionar o escalar la imagen al tamaño de la etiqueta (JLabel).

Primero nos creamos un proyecto de Java en Netbeans, en el cual creamos un formulario, al formulario le añadimos un JLabel al que llamaremos "lbImage" y un JButton al que llamaremos "btnEscalar" y le pondremos la etiqueta "escalar". Mediante la interfaz gráfica al JLabel le damos un tamaño determinado y luego le añadimos una imagen que no quepa en él.

El código que permite realizar el escalado de la imagen va dentro del botón "btnEscalar" y es el siguiente:

private void btnEscalarActionPerformed(java.awt.event.ActionEvent evt) {                                           
        ImageIcon imgIcon = new ImageIcon(getClass().getResource("/informatica.gif"));
        Image imgEscalada = imgIcon.getImage().getScaledInstance(lbImage.getWidth(),
                lbImage.getHeight(), Image.SCALE_SMOOTH);
        Icon iconoEscalado = new ImageIcon(imgEscalada);
        lbImage.setIcon(iconoEscalado);
}

Explicación:

En la línea de código 2 se crea un objeto de la clase ImageIcon en la cual se carga la imagen en la memoria.
A partir del objeto "imgIcon" creado, mediante el método getImage se obtiene un objeto de la clase Image y con éste se hace uso del método getScaledInstance (línea de código 3), el cual tiene tres parámetros de tipo entero: ancho, alto y una bandera que representa el tipo de algoritmo a utilizar para realizar el escalado de la imagen. Éste método devuelve un objeto de la clase Image que en este ejemplo llamamos "imgEscalada". Para que la imagen se ajuste al tamaño del JLabel utilizamos el ancho y alto de "lbImage"; y para que la imagen sea escalada con una buena calidad utilizamos el algoritmo que se indica con la constante Image.SCALE_SMOOTH.

En la línea de código 4 creamos un objeto de la clase Icon, llamado "iconoEscalado", y finalmente se le otorga al JLabel "lbImage" el icono con su nueva dimensión (línea de código 5).

Y bueno el resultado después de presionar el botón "escalar" sería el siguiente:

El ejemplo fue desarrollado bajo Windows Vista, en el lenguaje de programación Java y con ayuda del IDE Netbeans. Como siempre el código fuente y el ejecutable quedan a libre disposición.

Código Fuente: Download/Descargar

11 comentarios :

  1. men buen aporte pero quisiera saber como cambiar
    en ImageIcon imgIcon = new ImageIcon(getClass().getResource("/informatica.gif")); esta direccion("/informatica.gif") por la imagen q tengo ya en el jlabel traida desde la base de datos est es mi correo anferober@hotmail.com... GRACIAS

    ResponderEliminar
    Respuestas
    1. Si decís que tu jLabel ya está cargado con una imagen que cargas desde una base de datos o desde cualquier ubicación, en vez de utilizar esa línea de código que me decís, usá esta otra: ImageIcon imgIcon = (ImageIcon) lbImage.getIcon(); donde lbImage es tu jLabel con una imagen ya cargada, luego de esa línea de código procedé normalmente como les muestro en este ejemplo.

      Eliminar
    2. Tenia el mismo problema y utilizando ese código me funciono gracias!!!
      InputStream is = null;
      Icon ii = null;
      try {
      ResultSet res = (ResultSet) comandos.Listar("select img_estudio1 from estudios"
      + " where paciente_id = "+ jTCodigo.getText().toString());
      res.first();
      is = res.getBinaryStream(1);
      BufferedImage bi = ImageIO.read(is);
      ii =new ImageIcon(bi);
      jLImagen7.setIcon(ii);

      } catch (IOException ex) {
      Logger.getLogger(Pacientes.class.getName()).log(Level.SEVERE, null, ex);
      } catch (SQLException ex) {
      Logger.getLogger(Pacientes.class.getName()).log(Level.SEVERE, null, ex);
      }
      ImageIcon imgIcon = (ImageIcon) jLImagen7.getIcon();
      Image imgEscalada = imgIcon.getImage().getScaledInstance(jLImagen7.getWidth(),
      jLImagen7.getHeight(), Image.SCALE_SMOOTH);
      Icon iconoEscalado = new ImageIcon(imgEscalada);
      jLImagen7.setIcon(iconoEscalado);

      Eliminar
  2. calidoso q pena tanto molestar soy algo nuevo en el tema pero bueno mi pregunta es, si la imagen en vez de estar en un jlabel se encuentra en un jpanel como seria entoncs esa linea de codigo ( ImageIcon imgIcon = (ImageIcon) lbImage.getIcon(); )... Gracias

    ResponderEliminar
    Respuestas
    1. Los JPanel no tienen un método que te permita cargar una imagen como los tienen los JLabel, por tanto tampoco tienen un método que te devuelva una imagen cargada. Pero lo que se puede hacer es una clase que herede de JPanel y en ella dibujar la imagen que desees sobrecargando el método paint, en dicha clase también puedes programar los métodos setImagen(Image) y getImagen(), para cargar una imagen determinada en el JPanel y/o para obtener una imagen previamente cargada respectivamente.

      Eliminar
  3. hola buenas tardes una pregunta de donde viene la palabra Image del código líneas 3 y 4
    de tu código ya que al intentar utilizarlo me marca error de declaración gracias.
    My coreo es carlos_flakichi@hotmail.com

    ResponderEliminar
    Respuestas
    1. Para que Java te reconozca la clase "Image" debes importar el paquete java.awt.Image. Saludos!!!

      Eliminar
  4. Muchas gracias, me ha servido mucho.

    ResponderEliminar
  5. Muchas gracias amigo por el aporte, mi pregunta es solamente, de que manera pueda dejar fijo mi jlabel1

    ResponderEliminar

Encuesta: ¿Quién es el mejor catedrático de la carrera de Ing. Informática de la UAGRM?