2010-08-25 43 views
7

Tôi đang cố gắng tải hình ảnh nhanh chóng vào một hình tượng và vẽ lên chúng. Tôi có độ trễ 0,13 giây giữa thời gian tôi chỉ định bitmap cho hộp hình và khi nó hiển thị. Và bất cứ khi nào tôi thực hiện một số picturebox.refresh(), nó cũng giống như vậy .13 - .15 giây trước khi phương thức vẽ được gọi. Có cách nào để thoát khỏi sự chậm trễ này không?Hiển thị hộp hình ảnh nhanh hơn

Tôi đang sử dụng C# trong Visual Studio 2010. Tôi tải hình ảnh bằng thư viện FreeImage.

Đây là mã trong trường hợp pictureBox_MouseMove tôi:

if (IsMouseDown || DrawLine.Checked || IsMovingBox) 
{ 
    Tracing.Trace("Update Picture Box"); 
    pictureBox.Refresh(); 
} 

Sau đó, tôi truy ra một dòng khi sự kiện sơn của tôi được gọi. Sự chậm trễ là giữa hai dòng dấu vết.

Nếu tôi sử dụng hình ảnh tiff bitonal ở 117kb độ trễ là 0,1 giây. Để tải hình ảnh này vào bộ nhớ mất 0,04 giây. Để thay thế bitmap hình ảnh của tôi với bitmap này mất 0,01 giây.

Nếu tôi sử dụng hình ảnh jpg tỷ lệ xám ở mức 1125kb, độ trễ là 0,14 giây. Để tải hình ảnh này vào bộ nhớ mất 0,26 giây. Để thay thế bitmap hình ảnh của tôi với bitmap này mất 0,03 giây.

Trả lời

11

Giả sử không có sự chậm trễ khác trong mã của bạn sẽ ngăn chặn chuỗi giao diện người dùng nhập lại vòng lặp tin nhắn sao cho phương thức OnPaint() có thể được gọi: Trình xử lý sự kiện Paint của bạn được gọi là sau PictureBox đã vẽ Hình ảnh. Nó chưa được hiển thị, PB sử dụng bộ đệm đôi.

Hình ảnh đó tốn kém khi vẽ khi nó phải được thay đổi kích thước để phù hợp với khu vực khách hàng của PB. Rất có thể trong trường hợp của bạn vì hình ảnh của bạn khá lớn. Nó sử dụng một bộ lọc bi-khối chất lượng cao để làm cho hình ảnh được thay đổi kích thước trông tốt. Đó là khá tốn kém, mặc dù kết quả là tốt.

Để tránh chi phí đó, hãy tự đổi kích thước hình ảnh trước khi gán cho thuộc tính Hình ảnh. Làm cho nó chỉ lớn như ClientSize của PB.

Điều đó sẽ tạo ra sự khác biệt lớn trong chính nó. Điều tiếp theo bạn có thể làm là tạo bitmap thu nhỏ với định dạng pixel 32bppPArgb. Đó là định dạng nhanh hơn khoảng 10 lần so với bất kỳ loại nào khác vì nó phù hợp với bộ điều hợp video trên hầu hết các máy nên không cần chuyển đổi định dạng pixel.

Một số mã:

private void loadImage(string path) { 
     using (var srce = new Bitmap(path)) { 
      var dest = new Bitmap(pictureBox1.Width, pictureBox1.Height, System.Drawing.Imaging.PixelFormat.Format32bppPArgb); 
      using (var gr = Graphics.FromImage(dest)) { 
       gr.DrawImage(srce, new Rectangle(Point.Empty, dest.Size)); 
      } 
      if (pictureBox1.Image != null) pictureBox1.Dispose(); 
      pictureBox1.Image = dest; 
     } 
    } 

Bạn có lẽ sẽ muốn chắp vá này để hình ảnh lưu giữ tỉ lệ của nó. Hãy thử nó đầu tiên như là để đảm bảo bạn có được sự cải thiện perf.

+0

Hans, Điều đó có thể làm được! Các bài kiểm tra ban đầu chắc chắn tốt hơn! Lắp nó vào mã của tôi ở đây và thiết lập tỷ lệ khung hình chính xác ... – Mark

+0

Hans, Điều đó thật hoàn hảo! Rất đẹp! Cảm ơn! – Mark

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