2014-06-13 13 views
5

Mi piacerebbe essere in grado di spostarmi attraverso una gif fotogramma per fotogramma. Nell'esempio seguente, utilizzo una trackbar per selezionare il fotogramma di una gif che voglio vedere. Per il designer ho appena lasciato un PictureBox al centro dello schermo e ho bloccato una TrackBar nella parte inferiore dello schermo.Spostamento indietro di una gif molto più lentamente dello spostamento in avanti

using System; 
using System.Drawing; 
using System.Windows.Forms; 
using System.Drawing.Imaging; 

namespace TestGifProject { 
    public partial class Form1 : Form { 
     private Image gif; 
     private FrameDimension fd; 

     public Form1() { 
      InitializeComponent(); 

      gif = Image.FromFile("PATH\\TO\\SOME\\GIF.gif"); 
      // just for this quick example... 
      this.Width = gif.Width + 20; 
      this.Height = gif.Height + 53; 

      pictureBox1.Width = gif.Width; 
      pictureBox1.Height = gif.Height; 

      pictureBox1.Image = gif; 

      fd = new FrameDimension(gif.FrameDimensionsList[0]); 

      trackBar1.SetRange(0, gif.GetFrameCount(fd) - 1); 
     } 

     private void trackBar1_MouseUp(object sender, MouseEventArgs e) { 
      gif.SelectActiveFrame(fd, trackBar1.Value); 

      pictureBox1.Image = gif; 
     } 
    } 
} 

Quando si sposta e rilascia il trackbar, il telaio viene mostrato correttamente tuttavia è molto più lento quando si scorre all'indietro invece che in avanti (probabilmente 10 volte più veloce in avanti), spesso abbastanza a lungo da far sembrare che l'applicazione ha incidentato. C'è qualcosa che posso fare per accelerare a scorrere una gif?

+8

Nella maggior parte delle GIF animate, ogni fotogramma tranne il primo contiene solo la differenza con il fotogramma precedente. Ad esempio, se solo la parte superiore dell'immagine è cambiata, la cornice conterrà solo i dati per la parte superiore dell'immagine. La conseguenza è che, per leggere una GIF animata all'indietro, è necessario rileggerla dall'inizio ad ogni fotogramma, quindi il drammatico rallentamento –

+0

Ah, giusto, sospettavo che fosse qualcosa a che fare con il modo in cui una gif è memorizzata. Non sembra che ci sia un modo per velocizzare questo a corto di memorizzare una bitmap di ogni frame, ma questo è l'uso della memoria mega. Grazie per il post. –

+5

@KooKiz Dovresti fare una risposta piuttosto che un commento –

risposta

0

Un'opzione è creare un elenco in cui aggiungere ogni fotogramma. SelectActiveFrame() potrebbe risolvere l'immagine corretta con una logica più complessa, che potrebbe essere la ragione per un'azione lenta.

Creare un nuovo elenco al tuo radice di classe:

private List<Image> frames = new List<Image>(); 

Riempire la lista con le immagini dei fotogrammi:

for(int i = 0; i < gif.GetFrameCount(fd); i++) 
{ 
    gif.SelectActiveFrame(fd, i); 
    frames.Add((Image)gif.Clone()); 
} 

quindi utilizzare l'elenco per impostare le immagini al PictureBox:

pictureBox1.Image = frames[trackBar1.Value]; 

Non ho provato questo, ma penso che dovrebbe funzionare.

Problemi correlati