2016-09-01 20 views
0

InkCanvasのストロークコレクションをsvgイメージに保存することはできますか?私が見つけることができるのは、ISF(Ink Serialized Format)が埋め込まれたGIFとしてストロークを保存することも、ビットマップとしてレンダーすることもできます。ストロークを他のプラットフォーム(Webなど)と相互運用可能なベクター形式で保存したいWpf InkCanvasはstvをsvgとして保存します

+0

どのように質問が広すぎるのかわからないのですか?私は非常に具体的な質問をしています。犯罪はないが、広すぎるため閉鎖されたと投票した人は、質問を読み返すべきである。 – Mayank

+0

GIFとして保存する方法を追加することがあります。それから、svgを求めるのはあまり広すぎないでしょう。 – rene

答えて

2

私はそれを理解しました。ここで

  1. 反復StrokeCollection
  2. 以上の手順GetGeometry関数を呼び出した後、GetOutlinedPathGeometryを呼び出すことにより、各StrokePathGeometryを取得しています。
  3. FiguresGeometryから取得します。私は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

はい、私は正常に自分のアプリケーションで変更されたコードを使用し、うまく動作します。最初にペーストした元のコードを試しましたが、それが機能している間は、別のペン先の形状は保存されませんでした。変更後、私は形状を保存することができました。 –

関連する問題