2014-06-13 14 views
5

Tôi muốn có thể di chuyển qua khung gif theo khung. Trong ví dụ bên dưới, tôi sử dụng thanh trượt để chọn khung hình gif mà tôi muốn xem. Đối với các nhà thiết kế, tôi chỉ cần bỏ một PictureBox ở trung tâm của màn hình và bị mắc kẹt một TrackBar ở dưới cùng của màn hình.Di chuyển lùi qua gif chậm hơn nhiều so với di chuyển về phía trước

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

Khi bạn di chuyển và thả trackbar, khung được hiển thị một cách chính xác tuy nhiên nó là chậm hơn nhiều khi bạn di chuyển về phía sau chứ không phải là chuyển tiếp (có thể là 10x nhanh hơn về phía trước), thường thời gian đủ dài để làm cho nó có vẻ giống như các ứng dụng có bị rơi. Có điều gì tôi có thể làm để tăng tốc độ cuộn ngược qua gif không?

+8

Trong hầu hết GIF động, mỗi khung ngoại trừ khung hình đầu tiên chỉ chứa sự khác biệt với khung hình trước đó. Ví dụ, nếu chỉ phía trên của hình ảnh thay đổi, thì khung sẽ chỉ chứa dữ liệu cho phần trên của hình ảnh. Kết quả là, để đọc một GIF động trở lại, bạn cần phải đọc lại nó từ đầu tại mỗi khung hình, do đó sự suy giảm đáng kể –

+0

Ah phải tôi nghi ngờ nó là một cái gì đó để làm với cách gif được lưu trữ. Không âm thanh như có bất kỳ cách nào để tăng tốc độ này lên ngắn lưu trữ một bitmap của mỗi khung nhưng đó là sử dụng bộ nhớ lớn. Cảm ơn vì bài đăng. –

+5

@KooKiz Bạn nên làm cho câu trả lời đó chứ không phải là một chú thích –

Trả lời

0

Một tùy chọn là tạo danh sách nơi bạn thêm mỗi khung. SelectActiveFrame() có thể giải quyết hình ảnh chính xác với một logic phức tạp hơn, đó có thể là lý do cho hành động chậm.

Tạo một danh sách mới đến lớp root của bạn:

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

Điền danh sách với những hình ảnh khung:

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

Sau đó sử dụng danh sách để thiết lập hình ảnh vào PictureBox:

pictureBox1.Image = frames[trackBar1.Value]; 

Tôi chưa thử nghiệm điều này, nhưng tôi nghĩ rằng nó sẽ hoạt động.

Các vấn đề liên quan