Jump to content


Photo

[MULTILENGUAJE] TGifViewer un visor versátil de animaciones Gif


  • Please log in to reply
16 replies to this topic

#1 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4111 posts
  • LocationMadrid - España

Posted 28 February 2010 - 06:33 PM

TGifViewer es un control para visualizar imágenes GIF estáticas o en movimiento. Está basado en la clase TGif, que ya publiqué en el foro. He realizado alguna mejora en dicha clase y descubierto un pequeño bug que está solucionado.

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.
 

cpp
  1. RegisterComponents("Mios", classes, 0);

Inicialmente el código está escrito en C/C++ para Builder (ya sabéis que es mi debilidad  :p) 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.

Attached Files


  • 0

#2 enecumene

enecumene

    Webmaster

  • Administrador
  • 7419 posts
  • LocationRepública Dominicana

Posted 01 March 2010 - 06:52 AM

Hostia hombre, usted se merece muchas reverencias, esa es un clase super útil, insisto en que cuando sea grande quiero ser como tú :p :p (y).

Saludos.
  • 0

#3 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4111 posts
  • LocationMadrid - España

Posted 01 March 2010 - 02:02 PM

Muchas gracias a vosotros por el interés mostrado en el tema.

Lo prometido es deuda :D. He migrado el componente a delphi y actualizado la clase TGif que ahora está mejor enfocada hacia el tema de las transparencias en los Gif.

Lo dicho para la versión Builder C++ es válido para delphi, la clase es la misma. La aplicación de ejemplo es similar también. En el primer mensaje tenéis unas cuantas imágenes de ejemplo.

Subo la clase TGif y el control TGifViewer juntos en un archivo. La aplicación de ejemplo va por separado.

Espero que os sea de utilidad.

Saludos.

Attached Files


  • 0

#4 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14460 posts
  • LocationMéxico

Posted 01 March 2010 - 02:14 PM

Ah vaya, usted es rápido amigo escafandra, muchas gracias :)

Salud OS
  • 0

#5 sir.dev.a.lot

sir.dev.a.lot

    Advanced Member

  • Miembros
  • PipPipPip
  • 545 posts
  • Location127.0.0.1

Posted 13 July 2016 - 06:27 PM

Gracias por la Informacion, TGifViewer al repositorio para uso con Delphi 7 (y) :)


  • 0

#6 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4111 posts
  • LocationMadrid - España

Posted 23 September 2018 - 10:10 AM

Con motivo de la actualización de la clase TGIF he actualizado el componente TGifViewer para Builder, delphi, Berlin y Lazarus, cada uno en su versión. He de decir que el mismo código escrito para delphi 7 es válido para Berlin, lo mismo sucede con Builder. La propiedad Plus desaparece del componente. Lazarus tiene una versión propia para proporcionar soporte a Bitmaps de color indexado, que son los que usa Gif. En el caso de Lazarus, no llegué a publicar un componente como tal, cosa que si hago ahora.
 
Resumen:
1. Se simplifica la funcionalidad del componente y corrigen errores
2. Se da soporte a versiones modernas de delphi y Builder
3. Se da soporte a Lazarus,
 
 

Adjunto los proyectos, tened en cuenta que las librerías generadas deberían estar accesibles al IDE para que el componente sea visible y pueda usarse.

No puedo adjuntar un ejecutable Lazarus por motivos de restricciones de espacio en los archivos adjuntos. Sobre Lazarus tengo que añadir que funciona compilando para 32 y 64 bits. Las pruebas las hice con la versión 32 bits compliando e instalando el componente normalmente y después construyendo el ejemplo tanto para 32 bits como para 64.

 

 

 

Saludos.

Attached Files


  • 1

#7 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14460 posts
  • LocationMéxico

Posted 24 September 2018 - 12:53 PM

Excelente amigo. (y)

 

Saludos


  • 0

#8 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4111 posts
  • LocationMadrid - España

Posted 06 January 2020 - 06:31 PM

Con el fin de actualizar estos componentes, deberían recompliarse usando la revisión TGif V3.3 que he publicado aquí.

 

 

Saludos.


  • 1

#9 mav

mav

    Member

  • Miembros
  • PipPip
  • 16 posts

Posted 28 April 2021 - 06:47 AM

¿Como dejariamos el gif fijado en el lfm, para que no tenga que estar disociado del ejecutable?

Saludos


  • 0

#10 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4111 posts
  • LocationMadrid - España

Posted 30 April 2021 - 12:45 PM

¿Como dejariamos el gif fijado en el lfm, para que no tenga que estar disociado del ejecutable?

Saludos

Imagino que te refieres a que el ejecutable lleve el GIF como un recurso.

La respuesta es esa, incorpóralo como un recurso en tu archivo de recursos y con compilas con tu ejecutable. Seguro que este hilo te da las pistas.

 

Saludos.


  • 0

#11 mav

mav

    Member

  • Miembros
  • PipPip
  • 16 posts

Posted 30 April 2021 - 03:54 PM

Ok.....puede ser una solución intentaré entonces, modificar el componente para que permita cargar desde recurso además de desde archivo, aunque la 

solución mas atractiva sería integrarlo con el TImage y desde el inspector de objetos cargar el gif animado...pero a mi no me llegan los conocimientos

todavia para poder hacer eso..voy a probar lo de cargar desde recurso,,

Gracias. Saludos


  • 0

#12 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4111 posts
  • LocationMadrid - España

Posted 01 May 2021 - 12:49 PM

Ok.....puede ser una solución intentaré entonces, modificar el componente...


No te hace falta modificar el componente.
Si portas el Gif en tu ejecutable, lo puedes volcar al disco y leerlo desde el componente.
 
Creas con un editor de texto un archivo de recursos que puedes llamar MiGif.rc con el siguiente texto:


delphi
  1. MI_GIF RCDATA "UnArchivoGif.gif"

El código para volcarlo al disco es:


delphi
  1. with TResourceStream.Create(0, 'MI_GIF', RT_RCDATA) do
  2. begin
  3. SaveToFile(ExtractFilePath(ParamStr(0)) + 'recurso.gif');
  4. Free;
  5. end;

A partir de aquí lo cargas y visualizas con TGifViewer y si te apetece lo borras.

Si quisieras modificar el componente, yo modificaría la clase TGif para añadir la funcionalidad de cargar un Gif desde un TStream. Luego añadiría la misma funcionalidad a TGifViewer, para que le pase a TGif el Stream del Gif cargado. 

 

Saludos.


  • 0

#13 mav

mav

    Member

  • Miembros
  • PipPip
  • 16 posts

Posted 01 May 2021 - 01:50 PM

De acuerdo.¡Gracias!


  • 0

#14 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4111 posts
  • LocationMadrid - España

Posted 03 May 2021 - 12:55 PM

Tras la demanda de poder leer un gif desde un Stream, he hecho alguna modificación a la clase TGif y a TGifViewer para admitirlo añadiendo el método LoadFromStream a ambas clases.
 
Un ejemplo de como leer un Gif desde un recurso:


delphi
  1. var
  2. Stream: TResourceStream;
  3. begin
  4. Stream:= TResourceStream.Create(0, 'MI_GIF', RT_RCDATA);
  5. GifViewer.LoadFromStream(Stream);
  6. Stream.Free;
  7. end;

 
Os dejo adjuntos las nuevas versiones del componente.
 
 
Saludos.



.

Attached Files


  • 1

#15 ELKurgan

ELKurgan

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 566 posts
  • LocationEspaña

Posted 03 May 2021 - 10:46 PM

Muchas gracias, amigo Escafandra

 

Saludos (y)


  • 0

#16 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14460 posts
  • LocationMéxico

Posted 05 May 2021 - 09:39 AM

Excelente amigo Escafandra. (y)

 

Saludos


  • 0

#17 mav

mav

    Member

  • Miembros
  • PipPip
  • 16 posts

Posted 05 May 2021 - 11:04 AM

Muchisimas gracias, Escafandra.

Saludos.


  • 0




IP.Board spam blocked by CleanTalk.