2010-08-25 90 views
7

我正試圖快速將圖片加載到圖片框中並對它們進行繪製。在我將位圖分配給圖片框的時間與顯示的時間之間,我有0.13秒的延遲。而且每當我做一個picturebox.refresh(),它在調用paint方法之前的.13 - .15秒之前是相同的延遲。有什麼辦法擺脫這種延遲?更快地顯示圖片框

我在Visual Studio 2010中使用C#。我使用FreeImage庫加載圖像。

這裏是我的pictureBox_MouseMove事件中的代碼:

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

然後我描繪出一條線時,叫我漆事件。延遲在兩條跟蹤線之間。

如果我在117kb使用一個雙色調tiff圖像,延遲是0.13秒。將該圖像加載到內存需要0.04秒。用這個位圖替換我的picturebox位圖需要0.01秒。

如果我在1125kb使用灰度jpg圖像,則延遲爲0.14秒。將該圖像加載到內存需要0.26秒。用這個位圖替換我的picturebox位圖需要0.03秒。

回答

11

假設有在你的代碼沒有任何其他的延遲會阻止重新進入消息循環UI線程,以便OnPaint中()方法可以稱爲:你的Paint事件處理程序被調用的PictureBox已經引起了圖片。目前還不清楚,PB使用雙緩衝。

當必須調整大小以適應PB的客戶區域時,該圖像的繪製花費很大。你的情況很可能是因爲你的圖片相當大。它使用高質量的雙立方濾鏡來使調整大小的圖像看起來不錯。這很貴,儘管結果很好。

爲了避免這種開銷,請在將圖像分配給圖像屬性之前調整圖像大小。使其與PB的ClientSize一樣大。

這會對自身產生很大的影響。接下來,您可以使用32bppPArgb像素格式創建縮放位圖。它的格式比任何其他格式快大約10倍,因爲它匹配大多數機器上的視頻適配器,因此不需要像素格式轉換。

一些代碼:

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

你可能會想這個鼓搗因此圖像保留其長寬比。首先嚐試一下,確保獲得性能提升。

+0

漢斯,這可以做到!初始測試絕對更好!將它裝入我的代碼並正確設置縱橫比... – Mark 2010-08-25 17:59:27

+0

漢斯,那很完美!非常好!謝謝! – Mark 2010-08-25 19:25:26