2016-12-31 5 views
1

InkCanvas를 사용하여 서명 기능을 구현합니다.WPF : 획 컬렉션을 비트 맵에 저장하는 방법은 무엇입니까?

서명 후 RenderTargetBitmap 클래스를 사용하여 서명 도면을 비트 맵에 저장할 수 있습니다.

하지만 RenderTargetBitmap은 항상 InkCanvas 자체를 저장하므로 서명 내용 만 저장할 수는 없습니다.

내 질문은, 어떻게 StrokeCollection을 비트 맵에 저장합니까?

+0

두 가지 옵션이 있습니다. '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

그런 식으로 클립 보드를 사용하면 불편합니다 ... –