Formato .gif

Iniciado por @XSStringManolo, 31 Diciembre 2019, 23:52 PM

0 Miembros y 1 Visitante están viendo este tema.

@XSStringManolo

Qué bytes controlan el loop para editarlo con el HxD? Quiero reproducirlo una vez sola.

MCKSys Argentina

Hola!

El GIF es un formato que soporta múltiples imágenes. No sé si exista un valor dentro del mismo (header?) para decir que las mismas deben presentarse a una cierta cantidad de fps.

EDIT: Las imágenes tienen "duracion": https://stackoverflow.com/questions/9599547/how-can-i-get-the-number-of-frames-per-second-from-a-gif-file

Un editor que te puede ayudar mucho con formatos es el 010 editor (buscalo que anda x ahi con medicina incluida y los plugins de formatos te los bajas gratis desde la web del autor)

Saludos!
MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."


Serapis

#2
Sí, es el byte hex31D, es un dato de 16 bits en little-endian, un valor 0, indica infinito, y el máximo de vece sueltas es por tanto 65535 veces...
Pero OJO: esto slo si existe un bloque denominado 'AEB' (bloque de extensión de la aplicación), el cual (de existir) se encuentra en la dirección hex30D y debe contenee el valor "21.FF", si no contiene dicho valor es asumible que no es un gif animado (compatible, claro).
Por tanto en tu caso si quieres que solo se ejecuta una única vez y luego se detenga debes remplazar esos 2 bytes '00.00' por '01.00'

Luego lo que dice MCKSys Argentina, se refiere a la duración de un frame individual, esa info la aporta el 'header' de cada propio frame y por tanto no hay una dirección absoluta, ya que cada frame puede tener un tamaño distinto (es info tipo stream). Todavía esto solo se aplica si hay establecido un valor 0, en una posición absoluta, es decir, se puede optar por que cada frame imponga el tiempo de permanencia, o bien porque todos los frames tengan el mismo tiempo...

En este último caso, la dirección absoluta se encuentra en la dirección hex324, ocupa igualmente 2 bytes en little-endian y como en la descripción previa, dicha dirección solo es válida si el gif, incorpora un bloque 'CGE' (extensión de control gráfico), que se localiza en la posición hex320 y que de existir debe valer "21.F9".

Si te queda alguna duda, pregunta...

@XSStringManolo

#3
Cita de: MCKSys Argentina en  1 Enero 2020, 00:00 AM
Hola!

El GIF es un formato que soporta múltiples imágenes. No sé si exista un valor dentro del mismo (header?) para decir que las mismas deben presentarse a una cierta cantidad de fps.

EDIT: Las imágenes tienen "duracion": https://stackoverflow.com/questions/9599547/how-can-i-get-the-number-of-frames-per-second-from-a-gif-file

Un editor que te puede ayudar mucho con formatos es el 010 editor (buscalo que anda x ahi con medicina incluida y los plugins de formatos te los bajas gratis desde la web del autor)

Saludos!
Gracias, pero no me interesa modificar los fps ni la duración de laS imágenes. Eso ya está hecho. Solo quiero que deje de loopear para remplazar el gift por un .png de la última imagen. El editor no me sirve, estoy 99% del tiempo con Android.

Cita de: NEBIRE en  1 Enero 2020, 21:16 PM
Sí, es el byte hex31D, es un dato de 16 bits en little-endian, un valor 0, indica infinito, y el máximo de vece sueltas es por tanto 65535 veces...
Pero OJO: esto slo si existe un bloque denominado 'AEB' (bloque de extensión de la aplicación), el cual (de existir) se encuentra en la dirección hex30D y debe contenee el valor "21.FF", si no contiene dicho valor es asumible que no es un gif animado (compatible, claro).
Por tanto en tu caso si quieres que solo se ejecuta una única vez y luego se detenga debes remplazar esos 2 bytes '00.00' por '01.00'

Luego lo que dice MCKSys Argentina, se refiere a la duración de un frame individual, esa info la aporta el 'header' de cada propio frame y por tanto no hay una dirección absoluta, ya que cada frame puede tener un tamaño distinto (es info tipo stream). Todavía esto solo se aplica si hay establecido un valor 0, en una posición absoluta, es decir, se puede optar por que cada frame imponga el tiempo de permanencia, o bien porque todos los frames tengan el mismo tiempo...

En este último caso, la dirección absoluta se encuentra en la dirección hex324, ocupa igualmente 2 bytes en little-endian y como en la descripción previa, dicha dirección solo es válida si el gif, incorpora un bloque 'CGE' (extensión de control gráfico), que se localiza en la posición hex320 y que de existir debe valer "21.F9".

Si te queda alguna duda, pregunta...
No debe ser el mismo formato porque no están esos bytes en esas direcciones. Lo pasé de una forma rara por el parser de telegram para generarlo y me lo generó como nombre.gif.mp4 tiene la cabecera gif 89a.

Lo quiero usar en un html y funciona correctamente.

Donde encontraste esa info nebire? Es justo la clase de info que busco. Igual puedo encontrar la dirección del loop de este gif.

Ando probando y eliminando 2 bloques al final del archivo hace cosas raras el gif en el html. Parpadea y se detiende el gif un par de segundos dejándome visualizar el background del body, pero al poco vuelve a loopear.

PD: Llego un buen rato probando todas las combinaciones posibles en la cabecera después de netscape 2.0 y no consigo nada. Mirando por internet parece que el formato utiliza el contador del loop en little endian con los 2 bytes situados en los bytes posteriores a 2.0.
He provado todas las combinaciones y nada de nada.
Qué raro no?

http://www.vurdalakov.net/misc/gif/netscape-looping-application-extension





PARCIALMENTE SOLUCIONADO



47 49 46 38 39 61 00 05 80 02 77 00 00 21 ff 0b 4e 45 54 53 43 41 50 45 32 2e 30 03 01 01 00

01 00 equivale a 1 decimal. El problema es que se repite 1 vez. Pero si le pongo 0 se repite infinito. Asique no tengo muy claro cual es el valor para que no se repita en absoluto. Es decir, que solo se reproduzca una vez.

Serapis

#4
Cita de: @?0!,5^34 en  1 Enero 2020, 22:24 PM
Donde encontraste esa info nebire? Es justo la clase de info que busco. Igual puedo encontrar la dirección del loop de este gif.
Tengo infinidad de libros, varios de ello sobre formatos gráficos.
Si bien como tienen sus años, puede que alguna info no esté actualizada, auqnue el formato gif ya estaba bien asentado para tales fechas, si necesitas cosas más específicas me indicas y te lo miro más a fondo este fin de semana si no tienes prisas...

Cita de: @?0!,5^34 en  1 Enero 2020, 22:24 PM
No debe ser el mismo formato porque no están esos bytes en esas direcciones. Lo pasé de una forma rara por el parser de telegram para generarlo y me lo generó como nombre.gif.mp4 tiene la cabecera gif 89a.
Teóricamente sí, si se atiene al 'Netscape 2.0', pero me escama esa extensión mp4, aunque luego la cabecera coincida, pareciera querer indicar que es una 'interpretación libre'... y es muy mala idea hacer interpretaciones libres pero dejar en la cabecera lo que se espera que sea la especificación original (o extendida, pero finalmente aceptada).
Si (esa versión) solo cambia la dirección absoluta en el fichero, localiza los bytes que identifican los grupos que te mencionaba en el párrafo anterior...

Cita de: @?0!,5^34 en  1 Enero 2020, 22:24 PM
Lo quiero usar en un html y funciona correctamente.
Técnicamente debiera funcionar igual en pc que a través de html... cambiará solo el decodificador que se encargue de ello.

Cita de: @?0!,5^34 en  1 Enero 2020, 22:24 PM
01 00 equivale a 1 decimal. El problema es que se repite 1 vez. Pero si le pongo 0 se repite infinito. Asique no tengo muy claro cual es el valor para que no se repita en absoluto. Es decir, que solo se reproduzca una vez.
Es lo que te dije... con valor 0, significa infinito (de qué otra forma puedes indicar infinito con un valor numérico limitado, cuando todos los demás números pueden usarse como su valor???). 1 significa una solo ciclo de la animación y para...

Cita de: @?0!,5^34 en  1 Enero 2020, 22:24 PM
PD: Llego un buen rato probando todas las combinaciones posibles en la cabecera después de netscape 2.0 y no consigo nada. Mirando por internet parece que el formato utiliza el contador del loop en little endian con los 2 bytes situados en los bytes posteriores a 2.0.
He provado todas las combinaciones y nada de nada.
Qué raro no?
Ahí en tu imagen se ven claramente el par de bytes que mencionaba (más arriba): 21.FF, pués bien la dirección a cambiar son concretamente 16 bytes después... exactamente ese byte que tiene seleccionado en azul... con valor 01, se repetirá una vez... Es una animación así que debe repetirse al menos una vez, si no va a repetirse ninguna vez, sería mejor una de dos opciones:
A - Cambiar el formato para que sea un simple gif, no un gif animado (así además aligera peso, pués solo precisa un frame y no los chorrocientos que pueda tener la animación).
B - Forzando el tiempo d epermanencia de los frames a un tiempo tan elevado que antes de pasar al siguiente, sea probable que se haya cerrado la animación. Esto sería poner el valor 65535 en la posición 324 (recuerda que en la 320 debe existir el valor 21.F9), luego el valor a cambiar es 4 bytes más adelante: ponerlo en FF.FF que significa un intervalo de: 65535 centésimas de segundo (equivale a casi 11 minutos, 655'35sg.).

En la siguiente imagen se verifica lo que digo (y he probado con varias imágenes).
De rojo, los bytes que identifican las cabeceras de sendos grupos (coemntados en mi mensaje anterior), en verde los bytes a cambiar para los dos efectos comentados.

Nótese que en la posición 324, he cambiado a 65535, el valor que hace permanecer a cada frame el valor ahí designado (comentado en un párrafo previo como opción B) con 11 minutos, con lo que la animación tiene por efecto verse como si no se ejecutara ni una sola vez, a causa del alto tiempo de permanencia de cada frame (alguien tendrá 11 minutos delante un gif, para ver si cambia???). Es una simulación práctica de 0 repeticiones para una magen que de por sí es animada.



Cita de: @?0!,5^34 en  1 Enero 2020, 22:24 PM
Ando probando y eliminando 2 bloques al final del archivo hace cosas raras el gif en el html. Parpadea y se detiende el gif un par de segundos dejándome visualizar el background del body, pero al poco vuelve a loopear.
Mi consejo es que antes de hacer más cambios, hagas solo uno, pruebes en varias imágenes distintas y verifiques que funciona correctamente, antes de proceder con otros cambios...

Si al final quieres hacer demasiados cambios, tendrás que empaparte de toda la especificación del formato, no basta con saber el significado de 2 o 3 datos sueltos... los datos de dirección absoluta son pocos...



Por cierto, recordando he buscado y tenía por ahí el viejo (pero útil) Ms Gif animator... permite editar fácilmente las animaciones, incluído el cambiar los valores actuales, que tú quieres, Es muy sencillo de usar.
Si solo necesitas editar unos pocos, o alguno de cuando en cuando es más sencillo así, pero si necesitas hacerlo a chorrocientos o muy de contínuo, es preferible crearse un pequeño programa, ya preconfigurado.
https://workupload.com/file/RDc4dQQZ