Можно ли сохранить коллекцию штрихов InkCanvas в изображение svg? Единственное, что я могу найти, это то, что я могу сохранить штрихи в формате GIF со встроенным ISF (формат Ink Serialized Format) или, возможно, отобразить их в виде растрового изображения. Я хочу сохранить штрихи в векторном формате, который можно было бы взаимодействовать с другими платформами (например, с Интернетом).
Wpf InkCanvas сохраняет стоки как svg
comment
Не уверен, что вопрос слишком широк? Я задаю очень конкретный вопрос; без обид, но человек, который проголосовал за его закрытие, потому что он слишком широкий, должен перечитать вопрос.
- person Mayank   schedule 01.09.2016
comment
Может быть, добавить, как вы бы сохранить их в формате GIF. Тогда просьба о svg не будет слишком широкой.
- person rene   schedule 01.09.2016
Ответы (1)
Я понял.
Вот шаги
- Перебрать
StrokeCollection
- Получите
PathGeometry
каждогоStroke
, вызвав функциюGetGeometry
, а затем вызвавGetOutlinedPathGeometry
. - Получите
Figures
изGeometry
. Я делаю это, сохраняяPathGeometry
в XAML, а затем анализируя атрибутFigures
с помощьюXElement.Parse
. - Затем я могу просто создать документ 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).GetOutlinedPathGeometry();
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
Очень полезно! Я предлагаю изменить первую строку в цикле
foreach
на следующую: var geometry = stroke.GetGeometry(stroke.DrawingAttributes).GetOutlinedPathGeometry();
Это гарантирует, что если штрихи будут созданы с использованием других инструментов/атрибутов, они будут сохранены. Например, если кто-то использует перо квадратной формы вместо круглого. РЕДАКТИРОВАТЬ: отредактировал ответ, чтобы отразить это.
- person Dax Pandhi; 02.05.2017
@DaxPandhi вы пробовали правки? Просто убедитесь, что он работает с вашими правками. Если это так, пожалуйста, подтвердите, и я одобрю изменения. Спасибо
- person Mayank; 03.05.2017
Да, я успешно использовал модифицированный код в своем приложении, и он работает хорошо. Сначала я попробовал исходный код, который вы вставили, и пока он работал, мои различные формы пера не сохранялись. После модификации мне удалось сохранить формы.
- person Dax Pandhi; 04.05.2017