2014-06-13 9 views
5

Bir gif çerçevesinden çerçeve içinde hareket edebilmeyi isterim. Aşağıdaki örnekte, görmek istediğim bir gif çerçevesini seçmek için bir trackbar kullanıyorum. Tasarımcı için ekranın ortasına bir PictureBox düşürdüm ve ekranın altında bir TrackBar taktım. yönlendirirse (muhtemelen 10x daha hızlı ileri) daha geriye ziyade kaydırırken genellikle yeterince uzun uygulama var gibi görünüyor yapmak için, çok daha yavaş olduğunu ancak İleriye doğru hareket etmekten çok daha yavaş bir gif ile geriye doğru hareket etmek

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

taşımak ve trackbar bırakın

, çerçeve doğru gösterildiğinde çöktü. Bir gif ile geriye doğru kaymayı hızlandırmak için yapabileceğim bir şey var mı?

+8

Çoğu animasyonlu GIF'de, ilk hariç her çerçeve yalnızca bir önceki karedeki farkı içerir. Örneğin, sadece görüntünün üst kısmı değiştiyse, çerçeve yalnızca resmin üst kısmı için veri içerecektir. Bunun sonucu olarak, animasyonlu bir GIF'i geriye doğru okumak için, her bir karede baştan itibaren yeniden okumanız gerekir, bu nedenle de dramatik yavaşlama –

+0

Ah doğru bir gif'in nasıl saklandığından şüphelenildi. Bu, her karenin bitmapini saklamak için bunu hızlandırmanın herhangi bir yolu gibi gelmiyor, ama bu mega bellek kullanımı. Gönderi için teşekkürler. –

+5

@KooKiz Bu cevabı bir yorumdan ziyade yapmalısınız –

cevap

0

Her seçenek, her çerçeveyi eklediğiniz bir liste oluşturmaktır. SelectActiveFrame(), doğru görüntüyü daha karmaşık bir mantıkla çözüyor olabilir, bu da yavaş eylemin nedeni olabilir.

sınıf root için yeni bir liste oluşturun:

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

Sonra PictureBox görüntüleri ayarlamak için listeyi kullanın:

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

çerçeve görüntülerle listesini doldurun

pictureBox1.Image = frames[trackBar1.Value]; 

Bunu test etmedim, ama işe yarayacağını düşünüyorum.

İlgili konular