Wpf InkCanvas сохраняет стоки как svg

Можно ли сохранить коллекцию штрихов InkCanvas в изображение svg? Единственное, что я могу найти, это то, что я могу сохранить штрихи в формате GIF со встроенным ISF (формат Ink Serialized Format) или, возможно, отобразить их в виде растрового изображения. Я хочу сохранить штрихи в векторном формате, который можно было бы взаимодействовать с другими платформами (например, с Интернетом).


person Mayank    schedule 01.09.2016    source источник
comment
Не уверен, что вопрос слишком широк? Я задаю очень конкретный вопрос; без обид, но человек, который проголосовал за его закрытие, потому что он слишком широкий, должен перечитать вопрос.   -  person Mayank    schedule 01.09.2016
comment
Может быть, добавить, как вы бы сохранить их в формате GIF. Тогда просьба о svg не будет слишком широкой.   -  person rene    schedule 01.09.2016


Ответы (1)


Я понял.

Вот шаги

  1. Перебрать StrokeCollection
  2. Получите PathGeometry каждого Stroke, вызвав функцию GetGeometry, а затем вызвав GetOutlinedPathGeometry.
  3. Получите Figures из Geometry. Я делаю это, сохраняя PathGeometry в XAML, а затем анализируя атрибут Figures с помощью XElement.Parse.
  4. Затем я могу просто создать документ svg и добавить каждый путь (см. код ниже).

Я использую библиотеку визуализации SVG для создания документа SVG.

var svg = new SvgDocument();
var colorServer = new SvgColourServer(System.Drawing.Color.Black);

var group = new SvgGroup {Fill = colorServer, Stroke = colorServer};
svg.Children.Add(group);

  foreach (var stroke in InkCanvas.Strokes)
  {
      var geometry = stroke.GetGeometry(stroke.DrawingAttributes).GetOutlinedPath‌​Geometry();

      var s = XamlWriter.Save(geometry);

      if (s.IsNotNullOrEmpty())
      {
          var element = XElement.Parse(s);

          var data = element.Attribute("Figures")?.Value;

          if (data.IsNotNullOrEmpty())
          {
              group.Children.Add(new SvgPath
              {
                  PathData = SvgPathBuilder.Parse(data),
                  Fill = colorServer,
                  Stroke = colorServer
               });
           }
       }
}
person Mayank    schedule 02.09.2016
comment
Очень полезно! Я предлагаю изменить первую строку в цикле foreach на следующую: var geometry = stroke.GetGeometry(stroke.DrawingAttributes).GetOutlinedPathGeometry(); Это гарантирует, что если штрихи будут созданы с использованием других инструментов/атрибутов, они будут сохранены. Например, если кто-то использует перо квадратной формы вместо круглого. РЕДАКТИРОВАТЬ: отредактировал ответ, чтобы отразить это. - person Dax Pandhi; 02.05.2017
comment
@DaxPandhi вы пробовали правки? Просто убедитесь, что он работает с вашими правками. Если это так, пожалуйста, подтвердите, и я одобрю изменения. Спасибо - person Mayank; 03.05.2017
comment
Да, я успешно использовал модифицированный код в своем приложении, и он работает хорошо. Сначала я попробовал исходный код, который вы вставили, и пока он работал, мои различные формы пера не сохранялись. После модификации мне удалось сохранить формы. - person Dax Pandhi; 04.05.2017