2016-12-31 13 views
1

私はInkCanvasを使って署名機能を実装しています。WPF:ストロークコレクションをビットマップに保存する方法は?

署名した後、RenderTargetBitmapクラスを使用して署名描画をビットマップに保存できます。

ただし、RenderTargetBitmapは常にInkCanvas自体を保存するため、署名コンテンツのみを保存することはできません。

私の質問は、どのようにビットマップにStrokeCollectionを保存するのですか?

+0

2つのオプションがあります。 'StrokeCollection'をループし、個々のストロークを手動でオフセットして原点に描画するか、画像から空の部分を切り抜くだけです。個人的には、私は後者をお勧めします。 – Abion47

答えて

0

私はあなたがWin2D(Win2D.uwp NuGetパッケージ)を使うべきだと思います。それはかなり簡単です。 コードは次のとおりです。

 async void SaveAsBitmap(object sender, RoutedEventArgs e) 
    { 
     //copy from origianl canvas and paste on the new canvas for saving 
     var strokes = inkCanvas.InkPresenter.StrokeContainer.GetStrokes(); 
     //check if canvas is not empty 
     if (strokes.Count == 0) return; 

     //select all the strokes to be copied to the clipboard 
     foreach (var stroke in strokes) 
     { 
      stroke.Selected = true; 
     } 
     inkCanvas.InkPresenter.StrokeContainer.CopySelectedToClipboard(); 

     //paste the strokes to a new InkCanvas and move the strokes to the topper left corner 
     var newCanvas = new InkCanvas(); 
     newCanvas.InkPresenter.StrokeContainer.PasteFromClipboard(new Point(0, 0)); 

     //using Win2D to save ink as png 
     CanvasDevice device = CanvasDevice.GetSharedDevice(); 
     CanvasRenderTarget renderTarget = new CanvasRenderTarget(device, 
      (int)inkCanvas.InkPresenter.StrokeContainer.BoundingRect.Width, 
      (int)inkCanvas.InkPresenter.StrokeContainer.BoundingRect.Height, 
      96); 

     using (var ds = renderTarget.CreateDrawingSession()) 
     { 
      //ds.Clear(Colors.White); //uncomment this line for a white background 
      ds.DrawInk(newCanvas.InkPresenter.StrokeContainer.GetStrokes()); 
     } 

     //save file dialog 
     var savePicker = new Windows.Storage.Pickers.FileSavePicker() 
     { 
      SuggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.DocumentsLibrary 
     }; 
     savePicker.FileTypeChoices.Add("Image file", new List<string>() { ".jpeg", ".png" }); 
     savePicker.SuggestedFileName = "mysign.png"; 
     var file = await savePicker.PickSaveFileAsync(); 

     if (file != null) 
     { 
      using (var fileStream = await file.OpenAsync(FileAccessMode.ReadWrite)) 
      { 
       await renderTarget.SaveAsync(fileStream, CanvasBitmapFileFormat.Png); 
      } 
     } 
    } 
+1

そのようにクリップボードを使用すると、私は不快になります... –

関連する問題