domingo, 1 de noviembre de 2009

Imágenes en Java

En la Universidad programamos en Java, asi que he decidido agregar los apuntes que voy haciendo a lo largo de la carrera, asi hago una retroalimentación, ya que cuando reescribo mis apuntes me los aprendo más :D

En este caso escribiré como cargar las imágenes desde Java con el API que viene en el jdk de Sun.

En el ejemplo cargaremos una imagen en un JFrame. Como se ve en la figura de la derecha:



Entonces comencemos:

Imagenes en Java


Se mostrará como cargar y guardar un archivo de imagen en java, usando la librerias de la API de Java.
Es importante saber que el API se basa en el contenido del archivo. La Mayoria de las imagenes contiene un “Magic Number ” en sus primeros bytes que identifican el formato del archivo.
Las Clases Básicas que se usan para manipular imagenes desde son:
  • java.awt.Image
  • java.awt.image.BufferedImage
La Clase Image es abstracta, en sus metodos describe el funcionamiento de una Imagen.
La Clase BufferedImage se extiende de Image asi hereda todo el funcionamiente de la Clase Image.


Para cargar una imagen externa hacia tu programa java se debe usar la Clase Estatica ImageI/O. Donde contiene los metodos para escribir y leer imagenes desde un objeto File, URL, entre otros.
La clase ImageI/O reconoce el contenido de un archivo como el JPEG y lo decodifica en un BufferedImage que puede ser usado.

Cargar Imagen desde disco

En este ejemplo cargaremos imagen desde el disco duro, el archivo se llama “strawberry.JPG”.

Creamos en nuestro programa una variable de tipo BufferedImage , despues usaremos la clase estatica ImageIO donde contiene el metodo read(), este metodo esta sobrecargado ya que puede recibir por parametro un objeto File, InputStream, ImageInputStream o URL y nos devolverá un BufferedImage donde se encuentra la imagen.


BufferedImage img = null;
      try {
        img = ImageIO.read(new File("strawberry.JPG"));
      } catch (IOException ex) {
          System.out.println("No se pudo leer la imagen");
      }



Nota: Como sabemos la clase ImageIO es estatica, entonces no tenemos que inicializarla con el operador new.


Como vemos en el ejemplo creamos una variable de tipo BufferedImage donde le llamamos img:


 BufferedImage img = null;


Después desde la clase ImageIO llamamos al metodo estatico read(), donde le enviamos por parámetro un nuevo File con la direccion del archivo, en este caso a la imagen “strawbery.JPG”.


        img = ImageIO.read(new File("strawberry.JPG"));

Este método puede tener un error de entrada y salida de datos (IOException), asi que tendremos que capturar este error en un try catch().


BufferedImage img = null;
      try {
        img = ImageIO.read(new File("strawberry.JPG"));
      } catch (IOException ex) {
          System.out.println("No se pudo leer la imagen");
      }

Pero surge una pregunta, ¿En donde demonios voy a usar la clase BufferedImage?, pues como se dijo en el principio de este post, cargaremos una imagen en un JFrame, através del método paint que pertenece de la clase JFrame:

     public void paint(Graphics g)


Como se ve en metodo paint recibe por parámetro un objeto de tipo Graphics. La clase Graphics provee los métodos para trabajar con graficos, como dibujar lineas, ovalos, rectangulos, imagenes, etc. Aqui el metodo que nos importa es el metodo  


            Graphics g.drawImage(Image img, int x, int y, int width, int height, ImageObserver io);


En el método drawImage recibe por parámetro un objeto Image, después las coordenadas donde se posicionará la imagen, ancho, largo y por ultimo un objeto ImageObserver. 


La Clase BufferedImage se extiende la clase abstracta Image, por lo tanto se deduce que nuestra variable img de tipo BufferedImage puede pasarse por parámetro al metodo drawImage de Graphics g, donde a su vez es cuando se llama al método paint de la clase JFrame donde dibujara la imagen :D.


La implementacion de todo esto esta en el siguiente clase ImagenesBasico:


import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.*;


public class ImagenesBasico extends JFrame {

    private BufferedImage img = null;

    public ImagenesBasico() {
         super("Usando Imagenes"); //Llamamos al Contructor de JFrame
         leerImagen();
         setSize( 301,201 );
         setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
         setVisible(true);
    }

    /**

    * Método donde cargamos la imagen

    */
    public void leerImagen(){

        try {
            img = ImageIO.read(new File("strawberry.JPG"));
        } catch (IOException ex) {
            System.out.println("No se pudo leer la imagen");
        }
    }


    public void paint(Graphics g){
        g.drawImage(img, 10, 20,getWidth()-10, getHeight()-10, null);
    }


    public static void main(String[] args) {
        new ImagenesBasico();
    }
}



les dejo el codigo fuente y la imagen, ademas les anexo el Proyecto de Netbeans por si lo quieren abrir desde ese IDE,  es para que lo prueben: Codigo Fuente

Hasta aqui aprendimos a cargar una imagen desde el disco duro, en la proxima entrada escribiré como guardar una imagen en diferentes formatos.

Saludos y hasta luego...