elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  Animar Gif como fondo de escritorio, va muy lento.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Animar Gif como fondo de escritorio, va muy lento.  (Leído 4,058 veces)
**Aincrad**


Desconectado Desconectado

Mensajes: 652



Ver Perfil WWW
Animar Gif como fondo de escritorio, va muy lento.
« en: 18 Mayo 2021, 15:23 pm »

Hola, tengo una duda, haber si alguien podria ayudarme.

Estoy intentando poner un gif de fondo de pantalla , para eso... se me ocurre obtener cada frame del gif y cada frame , lo pongo de fondo de escritorio. pero el problema es que va lageado.

Esto es lo que estoy haciando :


Para manipular el Gif , uso la clase de elektro, yo hice la mia, pero consume mucha memoria. asi que F.

Clase : https://foro.elhacker.net/net/libreria_de_snippets_para_vbnet_compartan_aqui_sus_snippets-t378770.0.html;msg2116514#msg2116514


Y lo que estoy haciendo :

Código
  1.  
  2. '   StartEngine("C:\Users\S4Lsalsoft\Pictures\06bdf8ad69ff62062ae7dceb250d8866.gif")
  3.  
  4.    <DllImport("user32.dll", CharSet:=CharSet.Auto)>
  5.    Private Shared Function SystemParametersInfo(ByVal uAction As Integer, ByVal uParam As Integer, ByVal lpvParam As String, ByVal fuWinIni As Integer) As Integer
  6.    End Function
  7.  
  8.    Const SPI_SETDESKWALLPAPER As Integer = 20
  9.    Const SPIF_UPDATEINIFILE As Integer = &H1
  10.    Const SPIF_SENDWININICHANGE As Integer = &H2
  11.  
  12.  
  13.  
  14. Public Sub StartEngine(ByVal GifPath As String)
  15.         Dim key As RegistryKey = Registry.CurrentUser.OpenSubKey("Control Panel\Desktop", True)
  16.        key.SetValue("WallpaperStyle", 1.ToString())
  17.        key.SetValue("TileWallpaper", 0.ToString())
  18.        key.Dispose()
  19.  
  20.        Dim Asynctask As New Task(New Action(Sub()
  21.  
  22.                                                 Dim gif As New GIF(GifPath)
  23.  
  24.                                                 Do Until gif.EndOfFrames ' Iterate frames until the end of frame count.
  25.                                                     Dim CurrentFrame As Image = gif.NextFrame()
  26.  
  27.                                                     CurrentFrame.Save("BackgroundFrames\displayImage" & gif.ActiveFrameIndex & ".bmp")
  28.                                                     CurrentFrame.Dispose()
  29.  
  30.                                                     Dim tempPath As String = Path.Combine(Application.StartupPath, "BackgroundFrames\displayImage" & gif.ActiveFrameIndex & ".bmp")
  31.                                                     SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, tempPath, SPIF_UPDATEINIFILE Or SPIF_SENDWININICHANGE)
  32.  
  33.                                                     '   Thread.Sleep(60) ' Simulate a FPS thingy.
  34.                                                     Application.DoEvents()
  35.  
  36.                                                     If (gif.EndOfFrames) Then
  37.                                                         ' Set active frame to 0 for infinite loop:
  38.                                                         gif.ActiveFrameIndex = 0
  39.                                                     End If
  40.  
  41.                                                 Loop
  42.  
  43.                                             End Sub), TaskCreationOptions.PreferFairness)
  44.        Asynctask.Start()
  45.  
  46.    End Sub
  47.  
  48.  


Funciona pero va muy lento , alguna solucion? , gracias de antemano .




En línea



Serapis
Colaborador
***
Desconectado Desconectado

Mensajes: 3.314


Ver Perfil
Re: Animar Gif como fondo de escritorio, va muy lento.
« Respuesta #1 en: 18 Mayo 2021, 16:55 pm »

El principal problema de la lentitud, recáe en que un gif, es una cantidad de frames comprimidos y con transparencia (habitualmente), luego meterlo en un bucle, exige cada vez tener que descomprimir cada frame y recalcular y luego además como has elegido el modo 'tile', lo que supone que cada frame se repetirá hasta completar el tamaño de la pantalla, con tantas filas y columnas como se precisen (o recortar la imagen si excediera el tamaño de la pantalla).

Un típico visualizador de gif, lo que hace es en primer lugar extraer cada frame, esto es descomprimirlo y calcular la transparencia respecto del previo, de modo que se obtienen los frames descomprimidos simplemente como un 'picture' (un bitmap), serán luego esos bitmaps, los que iteren en el bucle... pero solo se descomprimen del fichero una sola vez. Ahí radica la principal desventaja de tu código.

Código:
array de picture  bitmaps()
entero numFrames

numframes = funcion ExtraerFrames(gif gif)
    picture  frame, framefull
    dimensionar bitmaps(0 a gif.NumFrames)
 
    por cada frame en gif.Frames
        frameFull = ResizeFrame(desktop.width, desktop.Height, frame, tile)
        bitmaps(x)= frameFull
        x+=1
    siguiente

    devolver gif.NumFrames
fin funcion
Una vez tomados los frames, ya puedes en tu bucle rotar entre entre ellos pero ahora de un array de imágenes, que no necesitan ser descomprimidas cada vez (aunque ignoro si tu objeto gif, ya las tiene extraídas de una vez) y que ya cada uno tiene ahora el tamaño del escritorio (y no escalar con cada cambio de imagen).
Por supuesto ahora teniendo cada imagen el tamaño del escritorio, debería signarse 'centrado' no 'tile' (que se retiene en la imagen)...
Por último, deberías detectar si hay cambio de orientación o del tamaño del escritorio (el cambio de orientación es un cambio de tamaño, excepto cuando rota 180º), para readaptar (invocar de nuevo el código previo para reconstruir) los frames al nuevo tamaño del escritorio.

Pero insisto en que no es buena idea hacer que el escritorio cambie constantemente su fondo.
El escritorio es la ventana 0, todo el resto del IDE de windows cuelga de él, es la raíz.
Cualquier sobrecarga en el uso o refresco del escritorio, supone un lastre para el resto.
Piensa que otro agravio en la lentitud, es que el escritorio ha de recortar todos los elementos que contiene para pegar la imagen... Si al menos estuviera vacío... se evitaría el recorte, pero claro entonces no se distinguiría de un 'salvapantallas'...

Como mínimo en tu bucle o bien pones un intervalo alto entre cambio de imágenes... o que se detenga cuando descubra que otros procesos (que no son el tuyo), consumen/demandan recursos del procesador...


En línea

**Aincrad**


Desconectado Desconectado

Mensajes: 652



Ver Perfil WWW
Re: Animar Gif como fondo de escritorio, va muy lento.
« Respuesta #2 en: 18 Mayo 2021, 18:08 pm »

El principal problema de la lentitud, recáe en que un gif, es una cantidad de frames comprimidos y con transparencia (habitualmente), luego meterlo en un bucle, exige cada vez tener que descomprimir cada frame y recalcular y luego además como has elegido el modo 'tile', lo que supone que cada frame se repetirá hasta completar el tamaño de la pantalla, con tantas filas y columnas como se precisen (o recortar la imagen si excediera el tamaño de la pantalla).

Un típico visualizador de gif, lo que hace es en primer lugar extraer cada frame, esto es descomprimirlo y calcular la transparencia respecto del previo, de modo que se obtienen los frames descomprimidos simplemente como un 'picture' (un bitmap), serán luego esos bitmaps, los que iteren en el bucle... pero solo se descomprimen del fichero una sola vez. Ahí radica la principal desventaja de tu código.

Código:
array de picture  bitmaps()
entero numFrames

numframes = funcion ExtraerFrames(gif gif)
    picture  frame, framefull
    dimensionar bitmaps(0 a gif.NumFrames)
 
    por cada frame en gif.Frames
        frameFull = ResizeFrame(desktop.width, desktop.Height, frame, tile)
        bitmaps(x)= frameFull
        x+=1
    siguiente

    devolver gif.NumFrames
fin funcion
Una vez tomados los frames, ya puedes en tu bucle rotar entre entre ellos pero ahora de un array de imágenes, que no necesitan ser descomprimidas cada vez (aunque ignoro si tu objeto gif, ya las tiene extraídas de una vez) y que ya cada uno tiene ahora el tamaño del escritorio (y no escalar con cada cambio de imagen).
Por supuesto ahora teniendo cada imagen el tamaño del escritorio, debería signarse 'centrado' no 'tile' (que se retiene en la imagen)...
Por último, deberías detectar si hay cambio de orientación o del tamaño del escritorio (el cambio de orientación es un cambio de tamaño, excepto cuando rota 180º), para readaptar (invocar de nuevo el código previo para reconstruir) los frames al nuevo tamaño del escritorio.

Pero insisto en que no es buena idea hacer que el escritorio cambie constantemente su fondo.
El escritorio es la ventana 0, todo el resto del IDE de windows cuelga de él, es la raíz.
Cualquier sobrecarga en el uso o refresco del escritorio, supone un lastre para el resto.
Piensa que otro agravio en la lentitud, es que el escritorio ha de recortar todos los elementos que contiene para pegar la imagen... Si al menos estuviera vacío... se evitaría el recorte, pero claro entonces no se distinguiría de un 'salvapantallas'...

Como mínimo en tu bucle o bien pones un intervalo alto entre cambio de imágenes... o que se detenga cuando descubra que otros procesos (que no son el tuyo), consumen/demandan recursos del procesador...

Gracias bro, voy a dejar la idea de cambiar constantemente el fondo de pantalla. e intentare dibujar directamente en el escritorio , debajo de los iconos. es muchísimo mas rapido, y no sobrecarga el escritorio.

En línea



**Aincrad**


Desconectado Desconectado

Mensajes: 652



Ver Perfil WWW
Re: Animar Gif como fondo de escritorio, va muy lento.
« Respuesta #3 en: 18 Mayo 2021, 19:57 pm »

Solucionado!


Tuve que convertir mucho código de c++ y c# a vb , pero valio la pena :



Solo faltan algunos ajustes.
« Última modificación: 18 Mayo 2021, 20:00 pm por **Aincrad** » En línea



Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
swf como fondo de escritorio
Diseño Gráfico
wACtOr 5 3,886 Último mensaje 11 Marzo 2005, 03:00 am
por wACtOr
Cómo convertir jpg en fondo de escritorio.
Diseño Gráfico
helejagy 9 3,001 Último mensaje 15 Septiembre 2006, 22:34 pm
por SirLanceCC
como añadir un fondo de escritorio a un formulario en java
Java
inforelectro 1 4,467 Último mensaje 2 Agosto 2008, 00:00 am
por ~~
¿editar .swf y ponerlo como fondo de escritorio en windows 7?
Diseño Gráfico
Kurolox 6 8,281 Último mensaje 24 Noviembre 2012, 17:39 pm
por Kurolox
Establecer Vídeo como fondo de Escritorio (Programa).
Programación C/C++
ProxyCarinae 2 2,447 Último mensaje 3 Octubre 2017, 17:54 pm
por ProxyCarinae
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines