RESPUESTA A LA PREGUNTA 713 ;El formato GIF (Graphic Interchange Format) #@9FORMATO GIF (Graphic Interchange Format)#@@ El formato GIF (Graphic Interchange Format) utiliza un sistema de un alto ratio de compresi¢n de datos llamado LZW... en honor a#@1 sus creadores (Lempel #@1-Ziv-Welsh), y es propiedad de Unisys.#@@ Bien, pues este formato se compone de una cabecera al principio del fichero (como todos, claro (NO, el RAW no es un formato ;) )... Bueno, a continua- ci¢n os hago uan tabla con la cabecera de un GIF: #@9 POSICION LONGITUD SIGNIFICADO VALOR COMUN BLOQUE#@@ #@3 ÛßßßßßßßßßÛßßßßßßßßßßßßÛßßßßßßßßßßßßßßßßßßßßßßÛßßßßßßßßßßßßÛßßßßßßßßßßßßÛ #@3 ³#@4 0 #@3 ³ 3 bytes ³ Tipo de imagen. ³ GIF ³IDENTIFICA. ³ #@3 ³#@4 3 #@3 ³ 3 "" ³ Versi¢n Gif ³ 87a/89a ³ ³ #@3 ³#@4 6 #@3 ³ 2 "" ³ Anchura PANTALLA ³ 320 ³DESCRIPCION ³ #@3 ³#@4 8 #@3 ³ 2 "" ³ Altura PANTALLA ³ 200 ³DE PANTALLA ³ #@3 ³#@4 10 #@3 ³ 1 "" ³ Byte informaci¢n 1 ³ 97 ³ ³ #@3 ³#@4 11 #@3 ³ 1 "" ³ Color de fondo ³ 0 ³ ³ #@3 ³#@4 12 #@3 ³ 1 "" ³ Relacion Ancho/Alto ³ 0 ³ ³ #@3 ³#@4 13 #@3 ³ 768 "" ³ Paleta colores ³ ---------- ³TABLA GLOBAL³ #@3 ³#@4 781 #@3 ³ 1 "" ³ Separador ³ 44 ³ ³ #@3 ³#@4 782 #@3 ³ 2 "" ³ L¡nea comienzo imagen³ 0 ³ ³ #@3 ³#@4 784 #@3 ³ 2 "" ³ Columna comienzo ³ 0 ³DESCRIPCION ³ #@3 ³#@4 786 #@3 ³ 2 "" ³ Anchura IMAGEN ³ 320 ³ DE ³ #@3 ³#@4 788 #@3 ³ 2 "" ³ Altura IMAGEN ³ 200 ³ IMAGEN ³ #@3 ³#@4 790 #@3 ³ 1 "" ³ Byte informaci¢n 2 ³ 7 ³ ³ #@3 ³#@4 791 #@3 ³ 1 "" ³ Long. m¡n. codigo LZW³ 8 ³CODIGO LZW ³ #@3 ÛÜÜÜÜÜÜÜÜÜÛÜÜÜÜÜÜÜÜÜÜÜÜÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÜÜÜÜÜÜÜÜÜÜÜÜÛÜÜÜÜÜÜÜÜÜÜÜÜÛ#@@ Como pode¡s observar, en la posici¢n 782 hay un word que indica el offset a partir de la cual debes empezar a descomprimir la imagen... dado que la ca- bezera nunca tiene el mismo tama¤o... #@3 þ El 'byte de informaci¢n 1 (pos. 10)' presenta la siguiente estructura: #@5 ...donde:#@@ #@3 7 6 5 4 3 2 1 0 'D' si es 0:#@4 No hay tabla global de color#@@ #@3 ÛßÛßÛßÛßÛßÛßÛßÛßÛ es 1:#@4 Existe tabla global de color#@@ #@3 ³D³C³C³C³B³A³A³A³ #@3 ÛÜÛÜÛÜÛÜÛÜÛÜÛÜÛÜÛ 'C' :#@4 Estos tres bits (4-6) indican el#@@ #@3 #@4 n£mero de bits por color primario.#@@ #@3 'B' si es 1:#@4 Tabla global de colores ordenada#@@ #@3 #@3 'A' :#@4 Tama¤o de la tabla global 3*2 ele-#@@ #@3 #@4 vado a D+1#@@ #@3 þ Y el 'byte de informaci¢n 2 (pos. 790)': #@5...donde:#@@ #@37 6 5 4 3 2 1 0 'E' si es 0:#@4 Usar tabla de color global#@@ #@3 ÛßÛßÛßÛßÛßÛßÛßÛßÛ es 1:#@4 No usar tabla de color global#@@ #@3 ³E³D³C³B³B³A³A³A³ #@3 ÛÜÛÜÛÜÛÜÛÜÛÜÛÜÛÜÛ 'D' si es 1:#@4 Imagen 'entrelazada'.#@@ #@3 #@3 'C' si es 1:#@4 Tabla local de colores ordenada#@@ #@3 'B' :#@4 Estos tres bits est n reservados...#@@ #@3 'A' :#@4 Tama¤o de la tabla local 3*2 elevado #@@ #@3 #@4 a I+1#@@ Despu‚s de esta informaci¢n vienen los bloques de datos... y estos tienen siempre la misma estructura. En primer lugar viene un byte que indica la longitud del bloque, y a continuaci¢n nos encontramos con los datos en si. Estos bloques nos servir n para obtener la imagen si los aplicamos al es- quema de compresi¢n LZW, que utiliza un m‚todo de#@7 'C¢DIGOS DE LONGITUD VA- #@7RIABLE'.#@@ Dichos c¢digos ser n de un rango de 1...4095 que para representarlo en bi- nario utilizariamos 2 bytes... pero ­antenci¢n!, esto no es as¡, dado que este valor se puede representar en 12 bits... a lo cual, estar¡amos desper- diciando 4 bits, y esto pasa tambi‚n igual que para otros valores c¢mo 2000 ¢ 500 que necesitar¡an 11 y 9 bits respectivamente y no 16. En est  carac- ter¡stica es la que se apoyan y utilizan los 'c¢digos de longitud variable' (es parecido al algoritmo de Huffman). As¡ tenemos que estos c¢digos #@7utili- #@7zan el m¡nimo n£mero de bits necesarios para representar el mayor c¢digo po- sible.#@@ Pero... ¨qu‚ van a representar esos c¢digos? Bien, estos c¢digos nos indi- car n unas series de tiras de colores que se repiten a lo largo de toda una imagen. A estas series las llamaremos 'patrones'. En la compresi¢n como en la descompresi¢n el precedimiento se basa en una tabla de patrones que se va construyendo paralelamente al tratamiento del fichero... Inicialmente la tabla se compone de los 256 colores de la paleta m s 2 c¢digos especiales, el c¢digo #@5CLEAR#@@ y el#@5 END#@@. El#@5 c¢digo CLEAR #@@ indica que se debe iniciarlizar la tabla de patrones con los valores iniciales... el #@5 c¢digo END #@@nos comunica que el proceso ha aca- bado. #@9PROCESO DE DESCOMPRESION FORMATO GIF#@@ ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß Bien... para descomprimir un archivo GIF los pasos que tendr¡amos que ha- cer ser¡an lo siguientes: #@1 PRIMERO.-#@4 Leemos primer c¢digo #@1 SEGUNDO.-#@4 Leemos siguiente c¢digo... #@1 TERCERO.-#@4 Insertamos en la tabla el patron del primer c¢digo y... #@1 3§.PRIMERO.-#@4 Si existe insertamos el patr¢n que corresponde #@4 con el segundo c¢digo #@1 3§.SEGUNDO.-#@4 Si por el contrario el c¢digo no existe #@4 buscaremos el patr¢n del primer c¢digo leido, #@4 que este seguro que existe... y a continuaci¢n #@4 insertamos el primer elemento de ‚ste. #@1 CUARTO .-#@4 La salida del patr¢n es la que corresponde al primer c¢digo. #@1 QUINTO .-#@4 Dejamos como primer elemento el £ltimo c¢digo le¡do#@@ Veamos un ejemplo: Supongamos que tenemos la cadena 50 258 50 35 260 25 259 35 ... #@1 CADENA:#@@ 50 258 50 35 260 25 259 35 #@1 TABLA:#@@ ... ... 255 - Color 255 256 - Clear 257 - End Indice!!-> 258 - ... <-!!Indice #@1SALIDA:#@@ Leemos el 50 y el 258. En la tabla insertamos por el momento en la posici¢n 258 el 50 y al no existir todav¡a el patr¢n del segundo c¢digo le¡do (50) que como es un valor mas peque¤o que 255 o sea un color de la paleta, el primer elemento es el mismo y alehop! ya tenemos un pixel. #@1CADENA:#@@ 50 258 50 35 260 25 259 35 ^^ ^^^ #@1TABLA:#@@ ... ... 255 - Color 255 256 - Clear 257 - End 258 - 50 50 259 - ... <- Indice! #@1SALIDA:#@@ 50 Tenemos ahora que leer el siguiente elemento y tenemos la cadena 258 50. Pues nosotros insertamos el patr¢n del primer c¢digo (50 50) y buscamos el 50. Como ‚ste no existe insertamos la tabla en el patr¢n correspondiente a 50 (que es 50). A la salida nos llevamos el patr¢n del primer c¢digo y nos queda as¡: #@1CADENA:#@@ 50 258 50 35 260 25 259 35 ^^ ^^^ ^^ #@1TABLA: ... ...#@@ 255 - Color 255 256 - Clear 257 - End 258 - 50 50 259 - 50 50 50 260 - ... <- Indice! #@1SALIDA:#@@ 50 50 50 Ahora leemos el siguiente c¢digo que es el 35, y nos queda la cadena 50 35. y buscamos en la tabla el segundo, y como existe metemos su patr¢n (‚l mis- mo). A la salida nos llevamos el patr¢n del primer c¢digo (50). En es- te tercer paso tenemos que nos queda as¡: #@1CADENA:#@@ 50 258 50 35 260 25 259 35 ^^ ^^^ ^^ ^^ #@1TABLA:#@@ ... ... 255 - Color 255 256 - Clear 257 - End 258 - 50 50 259 - 50 50 50 260 - 50 35 261 - ... <- Indice! #@1SALIDA:#@@ 50 50 50 50 Como pode¡s observar una vez entiendes el proceso ya no es nada d¡ficil hacer un visualizador de im genes GIF's... pero por si las moscas os lia- ¡s al hacerlo, os hemos dejado un visualizador de estas imagenes programa- do en 'C' en el directorio #@5".\PROGRAMS\FORM_GIF"#@@, si quieres ver el c¢digo fuente desde aqu¡, #@5pulsa F3 ahora#@@. Cristóbal Tello ctg@nil.fut.es