2012-04-17 56 views
0

我有一個圖像,我正在調整大小,drawString和FillEllipse
有很多點(FillEllipse)需要顯示n位圖,所以我使用for循環。
下面是代碼:加載位圖需要很長的時間

using (System.Drawing.Graphics Gfx = System.Drawing.Graphics.FromImage(OrginalBitmap)) 
{ 
     Gfx.SmoothingMode = SmoothingMode.HighQuality; 
     Gfx.CompositingQuality = CompositingQuality.HighQuality; 
     Gfx.InterpolationMode = InterpolationMode.HighQualityBicubic; 
     Gfx.PixelOffsetMode = PixelOffsetMode.HighQuality; 

    foreach (var points in SelectedPoints) 
     { 
      Gfx.FillEllipse(
       Brushes.Yellow,new Rectangle(points.X , points.Y, 8, 8)); 
      Gfx.DrawString("M", new Font("Arial",8), 
       Brushes.Yellow, points.X, points.Y); 
      //points.X and points.X are the points that needs to be drawn on bitmap(particular location). 
     }  
    } 
((IDisposable)OrginalBitmap).Dispose; 

加載繪製位圖的需要,如果有在SelectedPoints多點時間很長。 性能急劇下降,加載佔用太多內存。 請讓我知道該怎麼做。

在此先感謝。

+0

明顯的建議是嘗試改變質量,看看是否有效果。 – 2012-04-17 11:55:29

+2

只需注意一點:由於您位於使用(...)塊內,因此您不需要'Gfx.Dispose();''Gfx'被放置在塊的外面。 – Marco 2012-04-17 11:55:33

+1

另外,你是否有你想要製作的示例圖片,也許有更簡單的你可以做的。 – 2012-04-17 11:56:39

回答

0

即使在最高質量的環境下,只畫200點也不會引起任何性能問題。使用你的代碼,我可以在一秒鐘內在我的系統上畫出大約40000點。

假設SelectedPoints是Point[]List<Point>或其他有效類型,我會懷疑FontFacade.Large調用。每次都創建一個新的Font實例嗎?

編輯:

運行使用new Font("Arial", 8)上200點的修改後的代碼需要在我的系統大約20毫秒,所以有別的東西,是造成你的問題。在系統上運行代碼需要多長時間?完成後

Stopwatch timer = Stopwatch.StartNew(); 
[...] 
Debug.WriteLine(timer.ElapsedMilliseconds); 

創建的字體對象應佈置,我也將它的外循環,這樣只有一個實例被創建,儘管這似乎並不爲你的問題的根源。

using(Font font = new Font("Arial", 8)) 
{ 
    foreach(var point = SelectedPoints) 
    { 
    [...] 
    } 
} 

什麼是OriginalBitmap的尺寸,它是什麼PixelFormat?

SelectedPoints是什麼類型?

+0

是創建了一個新的字體實例 – Guddu 2012-04-17 12:14:24

+0

@Guddu,在系統上運行代碼需要多長時間?什麼是OriginalBitmap的尺寸,它是什麼PixelFormat?什麼類型是SelectedPoints? – Anlo 2012-04-18 08:12:02

相關問題