2016-09-01 2 views
0

InkCanvas 스트로크 컬렉션을 svg 이미지로 저장할 수 있습니까? 내가 찾은 것 중 하나는 스트로크를 ISF (Ink Serialized Format)가 내장 된 GIF로 저장하거나 비트 맵으로 렌더링 할 수 있다는 것입니다. 스트로크를 벡터 형식으로 저장하여 다른 플랫폼 (예 : 웹)과 상호 운용 할 수 있습니다.Wpf InkCanvas는 stv를 svg로 저장합니다.

+0

질문이 너무 광범위하다는 것을 잘 모르시겠습니까? 매우 구체적인 질문을하고 있습니다. 불쾌감은 없지만 너무 광범위하기 때문에 투표를 끝내기로 한 사람은 질문을 다시 읽어야합니다. – Mayank

+0

GIF로 저장하는 방법을 추가 할 수 있습니다. 다음 svg 사람을 요구해 너무 넓지 않을 것입니다. – rene

답변

2

나는 그것을 알아 냈다. 여기

  1. 으로 반복 StrokeCollection
  2. 을 통해 단계 GetGeometry 함수를 호출하고 GetOutlinedPathGeometry를 호출하여 각 StrokePathGeometry을 얻을 수 있습니다.
  3. 중에서 Figures을 얻으십시오. PathGeometry을 XAML에 저장하고 Figures 특성을 구문 분석하여이 작업을 수행하고 있습니다 (XElement.Parse).
  4. 그럼 이제는 svg 문서를 만들고 각 경로를 추가 할 수 있습니다 (아래 코드 참조).

저는 SVG Rendering Library을 사용하여 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 
       }); 
      } 
     } 
} 
+0

매우 유용합니다! 난 다음에 'foreach' 루프의 첫 번째 행을 변경 제안 : 'VAR 형상 = stroke.GetGeometry (stroke.DrawingAttributes)를 .GetOutlinedPathGeometry을()' 이 스트로크를 사용하여 만든 경우되도록 할 다른 도구/속성은 그대로 유지됩니다. 예를 들어 누군가 라운드가 아닌 사각형 모양의 펜촉을 사용하는 경우 EDIT : 이것을 반영하도록 답변을 편집했습니다. –

+0

@DaxPandhi 수정을 시도한 적이 있습니까? 편집과 함께 작동하는지 확인하기 만하면됩니다. 그렇다면 확인하고 수정 사항을 승인합니다. 감사합니다 – Mayank

+0

예, 성공적으로 내 자신의 응용 프로그램에서 수정 된 코드를 사용하고 잘 작동합니다. 먼저 붙여 넣은 원본 코드를 시도해 보았습니다. 작동하는 동안 제 다른 펜촉 모양이 저장되지 않았습니다. 수정 후 모양을 보존 할 수있었습니다. –