Carga de imágenes

De ChuWiki

En java, sin usar librería externas, podemos cargar imágenes de ficheros .gif, .jpg y .png

Es distinta la carga de imágenes según estemos en una aplicación normal de escritorio o en un Applet. También es distinto si el fichero está en el disco duro o si esta dentro del fichero .jar de nuestra aplicación.


Cargar imágenes desde un Applet[editar]

Si estamos en un Applet, sólo podemos cargar imágenes del servidor web donde esté nuestra página html y nuestro .class del Applet. Es decir, debemos poner la imagen en el servidor web.

La carga se realiza por medio de los métodos que tiene la clase Applet.

 public class MiApplet extends Applet
 {
    public void init()
    {
       Image imagen = getImage (getDocumentBase(), "fichero.gif");
    }
 }

Con getDocumentBase() obtenemos la dirección de la página html. Luego el fichero .gif debe darse con path relativo a la ubicación de nuestra página html. En el ejemplo, la página está en el mismo directorio que la imagen y por eso se pone el nombre tal cual.

Imagina por ejemplo que tenemos nuestro fichero html y al lado un directorio imagenes y dentro la imagen en cuestión

├───fichero.html
├───imagenes
│   └───fichero.gif

En este caso, deberíamos poner

 Image imagen = getImage (getDocumentBase(), "imagenes/fichero.gif");

Otro tema es que hayamos hecho un jar con nuestro Applet y la imagen esté dentro del jar. Entonces la carga se haría como se comenta en el apartado de cargar imagen desde un jar.

Cargar imagen en una aplicación de escritorio[editar]

Una forma fácil es con la clase ImageIcon, que de paso sirve para meter directamente en un botón o etiqueta

 ImageIcon icono = new ImageIcon("/path_absoluto/fichero.gif");
 JButton boton = new JButton (icono);
 
 // Si queremos la imagen
 Image imagen = icono.getImage();

El path puede ser absoluto, como en el ejemplo, o relativo al directorio donde se está ejecutando nuestro programa. Si estás en un IDE (eclipse, netbeans, Jbuilder) el directorio de ejecución suele ser el directorio donde está el proyecto, por lo que si el proyecto dice que pongas las imágenes, por ejemplo, en proyecto/src/Icons/fichero.gif, entonces el path relativo de carga es

 // fíjate que el path empieza sin /
 ImageIcon icono = new ImageIcon("src/Icons/fichero.gif");

Para saber con exactitud el directorio de ejecución, puedes probar esto

 System.out.println("Directorio ejecucion = " + System.getProperty("user.dir"));

y a partir del resultado, puedes determinar el path relativo.

Cargar una imagen dentro del .jar[editar]

Si el fichero de imagen está dentro del fichero del jar, debemos elegir una clase cualquiera que esté dentro de ese mismo jar, pedirle su ClassLoader y usarlo para cargar la imagen. Si la imagen está por ejemplo en el raiz dentro del jar y se llama serpi.gif, el código puede ser este

 URL urlDeLaImagen = UnaClaseCualquiera.class.getClassLoader().getResource("serpi.gif");
 ImageIcon icono = new ImageIcon(urlDeLaImagen);
 JLabel label = new JLabel(icono);
 // o bien, si queremos la imagen
 Image imagen = icono.getImage();


Esperar la carga de la imagen[editar]

Otra forma de cargar la imagen es con el Toolkit, de esta manera

 Image imagen = Toolkit.getDefaultToolkit().getImage ("/path_absoluto/fichero.gif");

Pero con este método, la carga puede tardar y se hace en "background", devolviéndonos el control inmediatamente, aunque la imagen todavía no se ha cargado.

El resultado es que nuestra ventana puede aparecer sin nuestra imagen y no aparecer hasta que le hagamos un refresco, bien desde código, bien "estirando" la ventana con el ratón o cualquier otro método.

Para evitar esto, necesitamos quedarnos parados y no seguir con nuestro código hasta que termine la carga de la imagen. Esto se consigue con la clase MediaTracker. Esta clase se encarga de observar como va la carga de la imagen y tiene métodos que nos permiten esperar a que termine.

 JLabel label = new JLabel(); 
 MediaTracker media = new MediaTracker(label);
 
 Image imagen = Toolkit.getDefaultToolkit().getImage ("fichero.gif");
 media.addImage(imagen, 23);
 try
 {
    media.waitForID(23);
 }
 catch (InterruptedException e)
 {
    System.out.println ("Me han interrumpido");
    System.out.println ("Puede que la imagen todavía no haya terminado de cargarse");
 }

Creamos el componente sobre el que vamos a dibujar la imagen, en nuestro ejemplo un JLabel y creamos el MediaTracker pasándole este componente en el constructor.

Luego cargamos la imagen de la forma habitual y se la pasamos al MediaTracker por medio de addImage(). También hay que pasar a este método un entero que nos inventemos que sirve de identificador de la imagen. Debemos usar un entero distinto por cada imagen que metamos en el MediaTracker y puede ser el que nos dé la gana.

Finalmente, esperamos la carga de la imagen con waitForID(), pasando el entero que nos sirve para identificar la imagen.

Debemos capturar la excepción de que alguien mande una interrupción al hilo, con lo que el waitForID() se saldría sin terminar la carga de la imagen. También tenemos métodos checkID() para comprobar si la imagen ha terminado de cargarse y getErrorsID() para tener una lista de errores por los que haya fallado una carga de imagen.

Si usamos un ImageIcon para cargar la imagen, no hace falta el MediaTracker, ya que ImageIcon lo tiene internamente y lo utiliza.

Resumen[editar]

  • Las imágenes en los Applets deben estar en el servidor y cargarse con el método getImage() del Applet.
  • Las imágenes dentro del jar deben cargarse usando el ClassLoader
  • Las imágenes de aplicaciones de escritorio se cargan directamente desde fichero o de dentro del jar.
  • Las imágenes se cargan en background. Podemos usar MediaTracker para esperar que termine la carga.