Cargar Imágenes

Esta página describe cómo obtener el objeto Image correspondiente a una imagen. Siempre que la imagen este en formato GIF o JEPG y se conozca su nombre de fichero o su URL, es sencillo obtener un objeto Image para ella: con solo utilizar uno de los métodos getImage() de Applet o Toolkit. Los métodos getImage() vuelven inmediatamente, sin comprobar si existen los datos de la imagen. Normalmente la carga real de la imagen no empieza hasta que el programa intenta dibujarla por primera vez.

Para muchos programas, esta carga en segundo plano funciona bien. Otros, sin embargo, necesitan seguir el proceso de carga de la imagen. Esta página explica cómo hacerlo utilizando la clase MediaTracker y el interface ImageObserver.

Finalmente, esta página contará cómo crear imágenes al vuelo, utilizando una clase como MemoryImageSource.

Utilizar los Métodos getImage()

Esta sección explica primero los métodos getImage() de la clase applet y luego los de la clase Toolkit.

La clase Applet suministra dos métodos getImage():

  • public Image getImage(URL url)
  • public Image getImage(URL url, String name)

Sólo los applets pueden utilizar los métodos getImage() de la clase Applet. Además, los métodos getImage() de Applet no trabajan hasta que el applet tenga un contexto completo (AppletContext). Por esta razón, estos métodos no trabajan si se llaman desde un constructor o en una sentencia que declara una variable de ejemplar. En su lugar, debería llamar a getImage() desde un método como init().

El siguiente ejemplo de código muestra cómo utilizar los métodos getImage() de la clase Applet. Puede ver Crear un GUI para una explicación de los métodos getbBase() y getDocumentBase().

//en un método de una subclase de Applet:
Image image1 = getImage(getcodeBase(), "imageFile.gif");
Image image2 = getImage(getDocumentBase(), "anImageFile.jpeg");
Image image3 = getImage(new URL("http://java.sun.com/graphics/people.gif"));
La clase Toolkit declara dos métodos getImage() más:
  • public abstract Image getImage(URL url)
  • public abstract Image getImage(String filename)

Se puede obtener un objeto Toolkit llamando al método getDefaultToolkit() por defecto de la clase o llamando al método getToolkit() de la clase Component. Este último devuelve el Toolkit que fue utilizado (o que será utilizado) para implementar el Componente.

Aquí tienes un ejemplo de la utilización de los métodos getImage() de Toolkit. Todas las applicaciones Java y los applets pueden utilizar estos métodos, en los applets están sujetos a las restricciones de seguridad usuales. Puedes leer sobre la seguridad de los applets en Entender las Capacidades y las Restricciones de los Applets.

Toolkit toolkit = Toolkit.getDefaultToolkit();
Image image1 = toolkit.getImage("imageFile.gif");
Image image2 = toolkit.getImage(new URL("http://java.sun.com/graphics/people.gif"));

Petición y Seguimiento de la Carga de una Imagen: MediaTracker e ImageObserver

El AWT proporciona dos formas de seguir la carga de una imagen: la clase MediaTracker y el interface ImageObserver.

La clase Mediatracker es suficiente para la mayoría de los programas. Se crea un ejemplar de MediaTracker, se le dice que haga un seguimiento a una o más imágenes, y luego se le pregunta por el estado de esas imágenes, cuando sea necesario. Puedes ver un ejemplo de esto en Aumentar la Apariencia y el Rendimiento de una Animación de Imágenes.

El ejemplo de animación muestra dos características muy útiles de MediaTracker, petición para que sean cargados los datos de un grupo de imágenes, y espera a que sea cargado el grupo de imágenes. Para pedir que sean cargados los datos de un grupo de imágenes, se pueden utilizar las formas de checkID() y checkAll() que utilizan un argumento booleano. Seleccionando este argumento a true empieza la carga de los datos para todas aquellas imágenes que no hayan sido cargadas. O se puede pedir que los datos de la imagen sen cargados y esperen hasta su utilización utilizando los métodos waitForID() y waitForAll().

El interface ImageObserver permite seguir más de cerca la carga de una imagen que MediaTracker. La clase Component lo utiliza para que sus componentes sean redibujados y las imágenes que muestran sean recargadas. Para utilizar ImageObserver, implemente el método imageUpdate() de este interface y asegurese de que el objeto implementado sea registrado como el observador de imagen. Normalmente, este registro sucede cuando especifica un ImageObserver para el método drawImage(), como se describe en la siguiente página. El método imageUpdate() es llamado encuanto la información sobre la imagen este disponible.

Aquí tienes un ejemplo de implementación del método imageUpdate() del inteface ImageObserver. Este ejemplo utiliza imageUpdate() para posicionar dos imágenes tan pronto como se conozcan sus tamaños, y redibujarlas cada 100 milisegundos hasta que las dos imágenes esten cargadas (Aquí tienes el programa completo.)

public boolean imageUpdate(Image theimg, int infoflags,
                           int x, int y, int w, int h) {
    if ((infoflags & (ERROR)) != 0) {
        errored = true;
    }
    if ((infoflags & (WIDTH | HEIGHT)) != 0) {
        positionImages();
    }
    boolean done = ((infoflags & (ERROR | FRAMEBITS | ALLBITS)) != 0);
    // Redibuja inmediatamente si lo hemos hechom si no vuelve a 
    // pedir el redibujado cada 100 milisegundos
    repaint(done ? 0 : 100); 
    return !done; //Si está hecho, no necesita más actualizaciones.
}
Si navegas por la documentación del API sobre MediaTracker, podrías haber observado que la clase Component define dos métodos de aspecto muy útil: checkImage() y prepareImage(). La clase MediaTracker ha hecho que estos métodos ya no sean necesarios.

Crear Imágenes con MemoryImageSource

Con la ayuda de un productor de imágenes cómo la clase MemoryImageSource, podrás construir imágenes a partir de la improvisación. El siguiente ejemplo calcula una imagen de 100x100 representando un degraado de colores del negro al azul a lo largo del eje X y un degradado del negro al rojo a lo largo del eje Y.
int w = 100;
int h = 100;
int[] pix = new int[w * h];
int index = 0;
for (int y = 0; y < h; y++) {
    int red = (y * 255) / (h - 1);
    for (int x = 0; x < w; x++) {
          int blue = (x * 255) / (w - 1);
          pix[index++] = (255 << 24) | (red << 16) | blue;
    }
}
Image img = createImage(new MemoryImageSource(w, h, pix, 0, w));


Ozito