2017-01-17 2 views
0

Поэтому у меня есть список пунктов, заказанных некоторые критерии:Увеличение скорости рисования линий

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

и я рисование линий между ближайшими точками 2 из этого списка с помощью

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-4 секунды для изображения пикселов размером 908 (ширина) x297 (высота).

Что я могу сделать, чтобы улучшить скорость?

EDIT: Опубликовано конечный результат ниже. Хотя первый подход все же позволяет более тонко манипулировать чертежом.

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

Было бы настоятельно предложено переместить инструкцию 'using' за пределами вашего' for' –

+1

. Почему это помечено тегом [tag: wpf]? –

+0

@ GlorinOakenfoot +1 к комментарию Глорина. Вы создаете и размещаете графический объект на каждой итерации цикла - перемещаете его за пределы, и он должен работать лучше. Ответ Андреаса тоже неплохая идея. – 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

Смежные вопросы