He de aclarar que el estándar Gif es bastante complejo y que no todas las imágenes que existen lo siguen escrupulosamente, quizás porque los decodificadores se han ido adaptando a la relajación de las normas. Es un formato lo suficientemente plástico como para permitir esas licencias. El control que propongo trata de seguir las especificaciones Gif originales pero consciente de la cantidad de imágenes existentes, incorpora propiedades para adaptarse a dichas imágenes. Quizás hubiese sido más práctico dar menos opciones, pero el control sería menos plástico y menos pedagógico.
En concreto, he encontrado falta de rigurosidad en dos temas importantes. El primero es el de las transparencias y el segundo, el modo en como se eliminan las imágenes después de cumplir el tiempo durante el que se deben mostrar. Esto último viene definido en una bandera localizada en el Graphic Control Extension de cada imagen, con los siguientes valores:
0 – Sin especificar, el decodificador no hará acciones tras terminar la visualización de la imagen.
1 – Sin acción, la imagen no se elimina
2 – Se restaura el color de fondo
3 – Se restaura la imagen previa.
Las opciones 0 y 1 en la práctica son lo mismo. Todos estos valores pueden tomarse por defecto del Gif o forzarlos en el visualizador TGifViewer, para este caso, disponemos de las propiedades necesarias desplegadas en la propiedad Plus (sus valores realmente tienen sumada una unidad porque considero el cero para el valor por defecto del Gif). Así mismo podemos forzar las transparencias y elegir el color que será transparente, aunque esta propiedad no es visual puede ser accedida por código (Plus->TransparentColor). El valor clNone para este color indica que se tomará el que tenga por defecto la imagen Gif a tratar.
La instalación del componente se hará de forma manual: Component->Install Component... También puede abrirse el proyecto del Package y compilarlo. En un principio está previsto que se incorpore a una paleta llamada "Mios" pero podemos cambiar esto.
RegisterComponents("Mios", classes, 0);
Inicialmente el código está escrito en C/C++ para Builder (ya sabéis que es mi debilidad ) pero cuando disponga de un poco mas de tiempo lo migraré a delphi.
Adjunto la clase TGif modificada, el control TGifViewer, una aplicación de ejemplo y un grupo de imágenes Gif
Espero que os sea de utilidad.
¡ATENCIÓN!
Actualización V. 2.0 Incluye componente propio para Lazarus AQUÍ.
Actualización V. 2,1 Última actualización del componente para Delphi, Builder y Lazarus AQUÍ.
Saludos.