El subprograma de Java se utiliza comúnmente para mostrar imágenes almacenadas en archivos GIF. Es muy sencillo cargar imágenes GIF en el subprograma Java. Cuando utilice archivos de imagen en el subprograma, debe definir el objeto Imagen. La mayoría de los applets de Java utilizan archivos de imagen en formato GIF o JPEG. El subprograma utiliza el método getImage para asociar el archivo de imagen con el objeto Imagen.
El método drawImage de la clase Graphics se utiliza para mostrar objetos de imagen. Para mejorar el efecto de visualización de las imágenes, muchos applets utilizan tecnología de doble almacenamiento en búfer: primero cargan la imagen en la memoria y luego la muestran en la pantalla.
El subprograma puede determinar qué parte de una imagen ya está en la memoria mediante el método imageUpdate.
Cargar una imagen
Java trata las imágenes como objetos de imagen, por lo que al cargar una imagen, primero debe definir el objeto de imagen. El formato es el siguiente:
Imagen de imagen
y luego usar el método getImage para conectar el objeto de imagen y el archivo de imagen:
imagen=getImage(getCodeBase( ),"ImageFileName.GIF");
El método getImage tiene dos parámetros. El primer parámetro es una llamada al método getCodeBase, que devuelve la dirección URL del subprograma, como por ejemplo www.sun.com/Applet . El segundo parámetro especifica el nombre del archivo de imagen que se cargará desde la URL. Si el archivo de imagen está ubicado en un subdirectorio del subprograma, la ruta del directorio correspondiente debe incluirse en el nombre del archivo.
Después de cargar la imagen usando el método getImage, el subprograma puede usar el método drawImage de la clase Graphics para mostrar la imagen. El formulario es el siguiente:
g.drawImage
(Picture,x,y,this);
especifique la imagen que se mostrará. Las coordenadas xey de la esquina superior izquierda de la imagen y esto.
El propósito del cuarto parámetro es especificar un objeto que implementa la interfaz ImageObServer, es decir, un objeto que define el método imageUpdate (este método se analiza más adelante).
Mostrar imagen (ShowImage.java)
//Lista de programas fuente
importar java.awt.*;
importar java.applet.*;
la clase pública ShowImage extiende Applet
Imagen picure; //Definir variables miembro de tipo Imagen
inicio público vacío()
{
imagen=getImage(getCodeBase(),"Image.gif"); //Cargar imagen
}
pintura de vacío público (Gráficos g)
{
g.drawImage(imagen,0,0,this); //Mostrar imagen
}
}
Por este motivo, las declaraciones sobre Applet en el archivo HTML son las siguientes:
<HTML>
<TÍTULO>Mostrar subprograma de imagen</TÍTULO>
<APPLET
CODE="ShowImage.class" //El nombre del archivo de clase es ShowImage.class
ANCHO=600
ALTURA=400>
</APPLET>
</HTML>
Cuando se ejecuta el subprograma después de la compilación, la imagen no aparece de una sola vez. Esto se debe a que el programa no carga ni muestra la imagen por completo antes de que regrese el método drawImage. Por el contrario, el método drawImage crea un hilo que se ejecuta simultáneamente con el hilo de ejecución original del Applet. Se carga y muestra al mismo tiempo, creando así esta discontinuidad. Para mejorar el efecto de visualización. Muchos applets utilizan tecnología de almacenamiento en búfer doble de imágenes, es decir, la imagen se carga completamente en la memoria y luego se muestra en la pantalla, de modo que la imagen se puede mostrar de una sola vez.
Imágenes de doble búfer
Para mejorar el efecto de visualización de las imágenes, se debe utilizar tecnología de doble búfer. La imagen primero se carga en la memoria y luego se muestra en la ventana del Applet.
Ejemplo de uso de la tecnología de imagen de doble buffer (BackgroundImage.java)
//Lista de programas fuente
importar java.awt.*;
importar java.applet.*;
la clase pública BackgroundImage extiende el subprograma //Hereda el subprograma
{
Imagen de imagen;
Imagen booleana cargada = falso;
inicio público vacío()
{
imagen=getImage(getCodeBase(),"Image.gif"); //Cargar imagen Imagen offScreenImage=createImage(size().width,size().height);
//Crear gráficos de objetos de imagen usando el método createImage offScreenGC=offScreenImage.getGraphics(); //Obtener el objeto de gráficos offScreenGC.drawImage(picture,0,0,this);
pintura de vacío público (Gráficos g)
{
si (imagen cargada)
{
g.drawImage(picture,0,0,null); //Mostrar imagen, el cuarto parámetro es nulo, no este
mostrarEstado("Listo");
}
demás
showStatus("Cargando imagen");
}
Actualización de imagen booleana pública (Imagen img, int infoflags, int x, int y, int w, int h)
{
si(infoflags= =ALLBITS)
{
imagen cargada = verdadero;
repintar();
devolver falso;
}
demás
devolver verdadero;
}
}
El análisis del método init del Applet muestra que el método primero define un objeto Imagen llamado offScreenImage y le asigna el valor de retorno del método createImage, y luego crea un objeto Gráfico llamado offScreenGC y le asigna un entorno gráfico, sin pantalla. la imagen será producida por éste. Debido a que la imagen fuera de la pantalla se dibuja aquí, no se mostrará ninguna imagen en la ventana del subprograma.
Siempre que el subprograma llame al método drawImage, drawImage creará un hilo que llamará al método imageUpdate. El subprograma puede determinar qué parte de la imagen se ha cargado en la memoria en el método imageUpdate. El hilo creado por drawImage sigue llamando al método imageUpdate hasta que el método devuelve falso.
El segundo parámetro infoflags del método imageUpdate permite al subprograma saber cómo se carga la imagen en la memoria. Este parámetro es igual a ImageLoaded y se establece en verdadero y se llama al método de repintado para volver a dibujar la ventana del subprograma. Este método finalmente devuelve falso para evitar que el hilo de ejecución de drawImage vuelva a llamar al método imageUpdate.
El funcionamiento del Applet en el método paint está controlado por la variable ImageLoaded. Cuando esta variable se vuelve verdadera, el método paint llama al método drawImage para mostrar la imagen. Cuando el método paint llama al método drawImage, toma nulo como cuarto parámetro, lo que evita que drawImage llame al método imageUpdate. Debido a que la imagen se ha cargado en la memoria en este momento, la visualización de la imagen en la ventana del subprograma se puede completar de una sola vez.