Labels

8 abr 2010

Meter una imagen en un arreglo en Java

A petición de la gente del chatsito, ahora les traigo este, masomenos, sencillo tutorial de cómo jalar los pixeles rgb de una imagen a un arreglo y metérselos a otra nueva que esté en blanco desde Java.

La clave de este show radica en la clase BufferedImage y algunos de sus métodos.

Lo primero será cargar la imagen desde el archivo a un objeto de la clase BufferedImage. Para ello podemos emplear bibliotecas no documentadas de Java como JPEGCodec, pero en esta ocasión utilizaremos una que sí está documentada: ImageIO

BufferedImage imagenOriginal = ImageIO.read(new FileInputStream("ubuntu.jpg"));

donde la función read (que es estática por eso no se crea objeto para usarla) de la clase ImageIO requiere como parámetro un objeto de la clase FileInputStream que a su vez requiere como parámetro la cadena url del archivo.

Ya almacenada la imagen, procedemos a extraerle los siguientes datos:

//Cargo el ancho y el alto de la imagen original
int w = imagenOriginal.getWidth(null);
int h = imagenOriginal.getHeight(null);
//Creo un arreglo de enteros igual al número de pixeles en la imagen
//que por supuesto está inicializado en ceros
int[] rgbs = new int[w*h];

//Extraigo la matriz de rgb de la imagen
int[] matrizImagen = imagenOriginal.getRGB(0, 0, w, h, rgbs, 0, w);


getRGB es una función que devuelve el arreglo de enteros de los pixeles de la imagen, es decir, es la función principal para crear el arreglo de los pixeles de la imagen.
Requiere los parámetros:

getRGB(desde qué pixel en x, desde qué pixel en y, ancho de la imagen, alto de la imagen, arreglo de rgb, desde qué columna epiezan las filas, cuántas columnas ocupa cada fila)

Ya que tengamos el arreglo de rgb de pixeles cargado en la memoria, comienza la magia: con este arreglo podemos crear imágenes nuevas, o bueno, crear imágenes en blanco y pasarles este arreglo para visualizar la imagen original.

Para ello hacemos lo siguiente:

//Creo e inicializo la imagenNueva en blanco
BufferedImage imagenNueva = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
//Le meto el arreglo de rgb de la original a la nueva
imagenNueva.setRGB(0, 0, w, h, matrizImagen, 0, w);

Al hacer el setRGB se necesitarán los mismos parámetros que para el getRGB, por ello mando w y h previamente extraídos de la imagen original más el arreglo de pixeles.
Cabe destacar que si modificamos los valores de los enteros en el arreglo matrizImagen, la nueva imagen cambia sus colores y lo hará más drásticamente mientras estos valores sean más grandes. Pueden probar haciendo un ciclo y sumando múltiplos de 10 para que vean la diferencia. Aunque claro, no obtendrán una edición tan buena como la de algún editor de imágenes.

Ahora, para mostrar una BufferedImage, se puede hacer mediante una JLabel de la siguiente manera:

//Cargo este BufferedImage en el label que lo mostrará
JLabel lblImagenOriginal = new JLabel(new ImageIcon(imagenOriginal)
JLabel lblImagenNueva = new JLabel(new ImageIcon(imagenNueva)

Esto gracias a que la clase JLabel cuenta con un constructor que requiere un objeto de la clase Icon para mostrar una imagen en vez de texto, pero como ImageIcon hereda de la clase Icon, usamos polimorfismo para enviar un objeto de esta última, pues ImageIcon cuenta con un constructor que requiere como parámetro un objeto de la clase Image, pero como BufferedImage hereda de la clase Image, de nuevo usamos polimorfismo para enviar un objeto de esta clase que es lo que estamos haciendo en el ejemplo.

Y bien, así es como se pueden extraer los pixeles de una imagen para meterlos a otra en blanco mediante un arreglo de enteros, jajaja.

Si les interesa hacer pruebas de código, les dejo este link de un jar que tiene el código fuente y el programa funcionando donde se muestra cómo cargar todo este desmadre. Si quieren usar el .java, abránlo con winRar y sáquenlo. Ahí mismo viene la imagen que usé.
Si solo quieren correrlo, extraigan la imagen del jar y denle doble click al jar.
En esta clase, sume 10000 a todos los elementos del arreglo para distorsionar los colores por lo cuál verán dos imágenes: la orginal y la nueva con los pixeles + 10000.

Bueno, dudas o aclaraciones ps me las hacen llegar por este medio. Que la fuerza los acompañe y el resto... lo dejo a su criterio.

Link del jar: http://www.megaupload.com/?d=5CKYF343

1 comentarios:

Los comentarios son gratis......deja uno