Ir al contenido principal

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...

Comentarios

  1. gracias me sirvio de mucho tu informacion

    ResponderEliminar
  2. ami tambien, muchas gracias

    ResponderEliminar
  3. Muy util. Gracias!.
    Soy nuevo en blog, pero e usado un año Ubuntu, igual y te puedo ayudar en algo!
    http://emmanuel-mylifeandmore.blogspot.com/
    @emmhrios

    ResponderEliminar
  4. gracias compañero me fue muy util !!!

    ResponderEliminar
    Respuestas
    1. amigo donde lo descargaste ese link de descarga esta como malo me podrias colaborar con eso?? para yo tambn descargarlo?? te agradezco

      Eliminar
  5. Gracias!! Esta información me ayudo muchísimo. xD

    ResponderEliminar
  6. Muchas gracias por este post,estoy empezando un pfc y me ha servido de mucho!!
    Un saludo!

    ResponderEliminar
  7. Hola!... muchas gracias!, busque información por muchos lugares, pero la única que me sirvió y fácil de comprender, fue la tuya.. muchas gracias.

    ResponderEliminar
  8. Hola buen blog, solo tengo una pregunta alguien me puede decir
    como hago para que me diga el formato de la imagen

    ResponderEliminar
    Respuestas
    1. Directamente con la clase BufferedImage no se me ocurre. Pero podrías detectarlo con la extensión del archivo desde la ruta donde cargas el archivo.

      Eliminar
  9. Muchas gracias, me fue muy útil tu código, saludos (:

    ResponderEliminar
  10. Hola una pregunta yo quiero poner una imagen de formato gif utilizando bufferedimage pero la imagen se muestra al cargar la ventana pero no se reproduce.. el metodo por cual lo pinte fue reescribiendo el metodo paintComponent de un jPanel y luego agregandolo al jFrame .. gracias

    ResponderEliminar
    Respuestas
    1. Si deseas agregar algo asi, te sugiero que uses la clase AnimatedIcon que aparece aqui: http://tips4java.wordpress.com/2009/06/21/animated-icon/. Saludos

      Eliminar
  11. que tal amigo, muy bueno el blog.
    tengo una duda sobre la carga de imagenes, esque cada vez que leo una imagen para mostrar y luego otra en el mismo jpanel mi meroria se llena y cada vez que leo otra esta sigue creciendo, hay manera de evitar que las imagenes despues de no usarlas se ..
    .. elimine de la memoria para no ocupar espacio?, ya intente con null, con remove() pero sigue igual.
    espero que me puedas ayudar

    ResponderEliminar
    Respuestas
    1. Muestra un poco de código, puede ser que esté afectando la manera es que lo estás haciendo. De preferencia usa github o bitbucket, sube esa parte y veo en que te puedo ayudar. ;). Saludos

      Eliminar

Publicar un comentario

Danos tu opinón:

Entradas populares de este blog

Libros sobre GNU/Linux

Les dejo una serie de libros de los más completos de GNU/LINUX, que a más de uno les va servir, ya sea un usuario novato o un usuario avanzado. Temas tomados por los libros: Administracion en Redes Administracion Basica de GNU/LINUX Introduccion al Desarrollo de Software (En lenguajes C,C++ y Java) Ingenieria en Software Desarrollo Web en linux Cuestiones Legales Introduccion a GNU/Linux Instalar Servidores Linux Administración Avanzada de gnu/linux temas de migración de Sistema Se los recomiendo ampliamente espero les sirva... LINK: http://cid-561d2d570dd7152b.skydrive.live.com/self.aspx/P%C3%BAblico/linux%5E_expert.rar Estos libros estan bajo licencia GPL, asi que se libre para compartir la información Saludos....

Una Breve Introduccion a Linux...

Linux es un Sistema Operativo de libre distribucion, que fue la unión del kernel creado por Linus Torvals , junto con Software del Proyecto GNU fundado por Richard Stallman . Por lo tanto a hora en adelante nos referiremos a Linux como " GNU/Linux o Gnu con Linux ". GNU/Linux es Software Libre y está sujeto bajo la licencia GPL ( General Public License) ,con lo cual te derecho de COPIAR, MODIFICAR y REDISTRIBUIR el software a quien quieras. Ejemplos de esto sería: Puedes Regalarle una copia de gnu con linux a un amigo o venderselo a tu primo. Puedes Modificar el software a tus necesidades, ya que tienes derecho a su código fuente. Esto es todo lo contrario a lo que te ofrecen empresas privativas como Microsoft, Apple, Norton. Ya que estas empresas solo te venden la licencia de uso y no tienes derecho al código fuente del programa. Además si no cumples con la licencia serás malo y te llamarán pirata, jejejeee. Si les interesa saber más sobr