InkCanvas를 사용하여 서명 기능을 구현합니다.WPF : 획 컬렉션을 비트 맵에 저장하는 방법은 무엇입니까?
서명 후 RenderTargetBitmap 클래스를 사용하여 서명 도면을 비트 맵에 저장할 수 있습니다.
하지만 RenderTargetBitmap은 항상 InkCanvas 자체를 저장하므로 서명 내용 만 저장할 수는 없습니다.
내 질문은, 어떻게 StrokeCollection을 비트 맵에 저장합니까?
InkCanvas를 사용하여 서명 기능을 구현합니다.WPF : 획 컬렉션을 비트 맵에 저장하는 방법은 무엇입니까?
서명 후 RenderTargetBitmap 클래스를 사용하여 서명 도면을 비트 맵에 저장할 수 있습니다.
하지만 RenderTargetBitmap은 항상 InkCanvas 자체를 저장하므로 서명 내용 만 저장할 수는 없습니다.
내 질문은, 어떻게 StrokeCollection을 비트 맵에 저장합니까?
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);
}
}
}
그런 식으로 클립 보드를 사용하면 불편합니다 ... –
두 가지 옵션이 있습니다. 'StrokeCollection'을 반복하고 각각의 개별 스트로크를 원점 모서리에 그려 지도록 수동으로 오프셋하거나 이미지에서 빈 공간을 자릅니다. 개인적으로, 나는 후자를 권하고 싶다. – Abion47