2017-01-17 49 views
0

的速度,所以我有一些標準,有序的點列表:增加畫線

List<System.Drawing.Point> points = new List<System.Drawing.Point>(); 
System.Drawing.Point prev = new System.Drawing.Point(); 

,我使用

prev = points[0]; 
System.Diagnostics.Stopwatch s1 = System.Diagnostics.Stopwatch.StartNew(); 
for (int i = 1; i < points.Count; i++) 
{ 
    var pp = points[i]; 
    using (Graphics dr = Graphics.FromImage(img)) 
    { 
     dr.DrawLine(bluePen, prev.X, prev.Y, pp.X, pp.Y); 
     prev.X = pp.X; 
     prev.Y = pp.Y; 
    } 
} 
s1.Stop(); 

從列表中最接近的2個點之間畫線這段代碼對於908(寬)x297(高)像素圖像需要2-4秒。

我該怎麼做才能提高速度?

編輯:發表最終結果如下。雖然第一種方法仍然允許更好地處理繪圖。

  using (Graphics dr = Graphics.FromImage(img)) 
       dr.DrawLines(bluePen, points.ToArray()); 
+8

強烈建議將'using'語句移動到'for'之外 –

+1

爲什麼標記爲[tag:wpf]? –

+0

@GlorinOakenfoot +1給Glorin的評論。您正在構建和處理每個循環迭代中的圖形對象 - 將它移到for之外,它應該表現更好。 Andreas的回答也是一個好主意。 – Clint

回答

5

嘗試DrawLines並使用一組點。那麼你可以做一個for循環。

Pen bluePen= new Pen(Brushes.DeepSkyBlue); 
Image img = Image.FromFile("my_granny.jpg"); 
List<System.Drawing.Point> points = new List<System.Drawing.Point>(); 

// fill points here ... 

System.Diagnostics.Stopwatch s1 = System.Diagnostics.Stopwatch.StartNew(); 
using (Graphics dr = Graphics.FromImage(img)) 
{ 
    dr.DrawLines(bluePen, points); 
} 
s1.Stop(); 

// do something with your img here 
+4

這不僅會更快,而且會產生__much__更好的結果對於除標準筆之外的所有其他筆記。爲了改進答案,爲什麼不發佈更正後的代碼? – TaW