2014-06-13 14 views
5

Chciałbym móc poruszać się po klatce gif klatka po klatce. W poniższym przykładzie używam paska, aby wybrać ramkę gifa, którą chcę zobaczyć. Dla projektanta upuściłem PictureBox na środku ekranu i utknąłem TrackBar na dole ekranu.Przechodzenie do tyłu przez gif znacznie wolniejszy niż poruszanie się do przodu

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; 
     } 
    } 
} 

Podczas przenoszenia i zwolnić potencjometr, ramka jest pokazany poprawnie jednak jest to znacznie wolniej podczas przewijania do tyłu zamiast do przodu (prawdopodobnie 10x szybciej przodu), często na tyle długo, by się wydawać, że aplikacja ma rozbił się. Czy jest coś, co mogę zrobić, aby przyspieszyć przewijanie do tyłu przez gif?

+8

W większości animowanych obrazów GIF każda klatka z wyjątkiem pierwszej zawiera tylko różnicę w stosunku do poprzedniej klatki. Na przykład, jeśli zmieni się tylko górna część obrazu, ramka będzie zawierała tylko dane dla górnej części obrazu. Konsekwencją jest to, że aby przeczytać animowany GIF w tył, musisz go ponownie przeczytać od początku w każdej klatce, stąd dramatyczne spowolnienie –

+0

Ach tak, jak podejrzewałem, że ma to coś wspólnego z przechowywaniem gifa. Nie wygląda na to, że jest jakikolwiek sposób na przyspieszenie tego przechowywania map bitowych każdej klatki, ale to jest mega użycie pamięci. Dzięki za post. –

+5

@KooKiz Powinieneś zrobić odpowiedź zamiast komentować –

Odpowiedz

0

Jedną z opcji jest utworzenie listy dodawania każdej klatki. SelectActiveFrame() może rozwiązać prawidłowy obraz z bardziej złożoną logiką, która może być przyczyną powolnego działania.

Utwórz nową listę do swojej klasy root:

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

Wypełnić listę obrazów Rama:

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

następnie użyj listy, aby ustawić obrazy do PictureBox:

pictureBox1.Image = frames[trackBar1.Value]; 

Nie testowałem tego, ale myślę, że powinno działać.

Powiązane problemy