miércoles, 3 de febrero de 2010

Cargando un BMP byte a byte con JAVA

Prefacio
Este post está dedicado a entender como cargar un archivo BMP con java pero bueno a que viene eso, si ya hay librerías y APIs o métodos de la librería swing que hacen este trabajo sucio. Pues bueno me interese en saber como haría para cargar esta imagen byte a byte de un fichero almacenado, para después cargar una imagen en un LCD de un celular (eso es para después), bueno la lógica es la misma creo en los diferentes lenguajes.

LinkGrafia
http://es.wikipedia.org/wiki/BMP
http://carlosagreda.googlepages.com/bmp.html
http://elblogdelfrasco.blogspot.com/2008/06/java-nivel-de-bits.html

Que se necesita
1. Netbeans 5.5 o mayor.

Empezamos

Bueno los primeros 54 bytes de todo archivo BMP son de la metadata (Información del Fichero) dicha información la encontrar en los 2 link que os pongo a disposición.
Bueno a mi me sirvieron los Bytes que conforman el alto y ancho de la imagen.

A Continuación les pongo el fragmento de código que permite leer los 54 bytes para sacara el ancho alto y tamaño de la imagen.




Es hora de explicar esto:

(datos[i] & 0xff)



Bueno eso es nada más que una operación lógica a nivel de bits por ejemplo si en binario seria:


1 Byte 2 Byte 3 Byte 4 Byte Hexadecimal Decimal
00000000 00000000 00000000 01111110 0x7E 126
Aplico el operador &
11111111 11111111 11111111 11111111 0xFF 255
Resultado
00000000 00000000 00000000 01111110 0X7E 126


Como se observa no pasa nada e incluso es un poco innecesario pero al momento de leer los bytes del fichero el método read inserta en el vector valores negativos por lo cual se la aplica la máscara para que devuelva el valor real del número.

Segundo ahora a que viene el símbolo <<
((long)(datos[2] & 0xff))<<bite

Bueno esto es una operación de desplazamiento que lo que hará es que el resultado anterior moverlo 0, 8, 16 y 24 posiciones si quisiera mover 8 bits a la izquierda seria así:

byte1=00000000.00000000.0000000.11100111
byte2=00000000.00000000.1111101.00000000
byte3=00000000.00000010.0000000.00000000
byte4=10111101.00000000.0000000.00000000
byte1 | byte2 | byte3 | byte4
Resultado
byte=10111101.00000010.1111101.11100111 = 5E817DE7 = 1585544679 Bytes


bueno lo del (long) esta demás pero no es nada más que un casting de tipos de datos ahora así como unimos los bytes. lo haremos usando el operador | de operación lógica de bits. Resumiendo


Uffff larga explicación... solo para el inicio bueno todo esto se pude resumir practicando y usando un ciclo for.

Bueno una vez sacado los datos de la meta data nos queda nada más que hacer 2 for para recorrer las filas y columnas, leer los bytes que nos quedan de 3 en 3 ya que ese el estándar RGB el primer byte es el ROJO(R), el segundo el VERDE(G) y el Tercero el AZUL(B) quedando así (255,255,255) y por ultimo sobrescribir el método paint de un formulario swing para graficar el pixel basta con poner:
g2d.drawRect(x,y,1,1)
Le pones de 1 de ancho por 1 de alto hay el pixel el código es el siguiente:



La variable resto son bytes sobrantes que debe calcularse en el bmp y leer estos bytes restantes para que no se descuadre a imagen.

Nota: el for de las filas empieza al revés por que se almacenan de abajo hacia arriba.

Descarga el Proyecto

Con Nuevo Blog ...

Esmpezando el 2010 y migro de blog mas que todo lo hize por usar el svn de google y estaba arto de tanto spam en mi cuenta de gmail.... voy a recuperar mis post anteriores antes que los borren definitivamente