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?
1
A
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 ... –
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