WPF Рисование списка полилиний на холсте - PullRequest
0 голосов
/ 20 февраля 2020

image seismi c collect Извините за мой плохой Engli sh.

Я создаю визуализацию для сейсмических c наборов. Сбор содержит около 100-300 следов. Каждая трасса (polyline) содержит более 1000 точек.

Если я попытаюсь добавить List<polyline> к холсту как canvas.Children.Add, у меня возникнет проблема. Приложение тратит много ресурсов.

Я обнаружил, что одним из ключей к решению этой проблемы является использование растрового изображения (RenderTargetBitmap). Но я не могу понять, как избежать рендеринга полилиний на холсте и сразу экспортировать полилинии в растровое изображение, а затем загрузить на холст.

xaml

<Canvas x:Name="Canvas_Pic">
</Canvas>

wpf

public void ViewData(Canvas canvas)
{
     DrawTraces(canvas);
     ConvertToBitmap(canvas);
}

public void DrawTraces(Canvas canvas)
{
     List<Polyline> traces = CreatePointsCollection(); // convert double array to polyline list

     for (int p = 0; p < traces.Count; p++)
     {
          traces[p].StrokeThickness = 0.5;
          traces[p].Stroke = Brushes.Black;
          canvas.Children.Add(traces[p]);
     }
}

public void Function(Canvas canvas)
{
     Rect bounds = VisualTreeHelper.GetDescendantBounds(canvas);
            var rtb = new RenderTargetBitmap((int)canvas.ActualWidth, (int)canvas.ActualHeight, 96,           
     96, PixelFormats.Pbgra32);

     DrawingVisual dv = new DrawingVisual();

     using (DrawingContext dc = dv.RenderOpen())
     {
          VisualBrush vb = new VisualBrush(canvas);          
          dc.DrawRectangle(vb, null, new Rect(new Point(), bounds.Size));
     }

     rtb.Render(dv);

     var bitmap = new PngBitmapEncoder() { Frames = { BitmapFrame.Create(rtb) } };
     using (var file = File.Create("file.png"))
          bitmap.Save(file);
     canvas.Children.Clear(); // clear existing polilines
     ImageBrush brush = new ImageBrush();
     brush.ImageSource = new BitmapImage(new Uri("file.png", UriKind.Relative));
     canvas.Background = brush;     
}

Также у меня есть проблема с загрузкой растрового изображения на холсте. Я не могу создать растровое изображение, пока холст не отрисовывается с помощью полилиний. Вот почему я дважды вижу одно изображение: сначала, когда на холсте нарисованы полилинии, а затем растровое изображение - это фон холста.

Как я могу его оптимизировать. Чтобы создать прямое растровое изображение, избегая добавления полилиний на холст?

С уважением.

...