2016-12-31 4 views
1

J'utilise InkCanvas pour implémenter la fonction de signature. Après la signature, je peux utiliser la classe RenderTargetBitmap pour enregistrer le dessin de la signature en bitmap. Mais RenderTargetBitmap enregistre toujours InkCanvas lui-même, ce qui signifie qu'il ne peut enregistrer que le contenu de la signature. Ma question est, comment sauver StrokeCollection en bitmap?WPF: comment enregistrer la collection de traits au format bitmap?

+0

Vous avez deux options. Faites une boucle dans 'StrokeCollection' et décalez manuellement chaque trait pour qu'il soit dessiné dans le coin de l'origine, ou recadrez simplement l'espace vide de votre image. Personnellement, je recommanderais ce dernier. – Abion47

Répondre

0

Je pense que vous devriez utiliser Win2D (paquet Win2D.uwp NuGet); c'est plutôt facile. Voici le code:

 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

Utiliser le presse-papiers de cette façon me rend mal à l'aise ... –