2017-09-14 5 views
0

WindowsインクをUWPアプリケーションに組み込み、Windows Ink tutorial appに、描画されたストロークを(GIF/ISFではなく)PNG画像として保存するように修正しました。Windowsインクを透明なPNG画像として保存します。

ので、XAMLビューがWindows.UI.Xaml.Controls.InkToolbarWindows.UI.Xaml.Controls.InkCanvasを含み、そして私はキャンバス上のストロークを描き、次のコードを介して画像ファイルとして保存することができるよ:

IReadOnlyList<InkStroke> currentStrokes = inkCanvas.InkPresenter.StrokeContainer.GetStrokes(); 
if (currentStrokes.Count > 0) 
{ 
    StorageFile file; 
    // Using a file picker to identify the target file -> omitted this part 
    if (file != null) 
    { 
     CanvasDevice device = CanvasDevice.GetSharedDevice(); 
     CanvasRenderTarget renderTarget = new CanvasRenderTarget(device, (int)inkCanvas.ActualWidth, (int)inkCanvas.ActualHeight, 96); 

     using (var ds = renderTarget.CreateDrawingSession()) 
     { 
      ds.Clear(Colors.White); 
      ds.DrawInk(currentStrokes); 
     } 
     using (var fileStream = await file.OpenAsync(FileAccessMode.ReadWrite)) 
      await renderTarget.SaveAsync(fileStream, CanvasBitmapFileFormat.Png, 1f); 
    } 
} 

すべてがとてもうまく動作します遠い今、私は透明な背景を持つ画像を保存すると、次の行を変更したい:

ds.Clear(Colors.Transparent); 

この場合であっても、ファイルが保存され、背景が透明であり、ボールペン、鉛筆ストロークだけでなく、ストロークは正しくレンダリングされますが、画像結果にはハイライターツールで描画されたストロークは含まれません。

この場合、これらのストロークが省略される理由を誰かが説明できますか?何とか透明な背景上で蛍光灯のストロークをレンダリングすることは可能ですか?

答えて

2

問題はハイライトストロークが透明であることです。 Transparentの色をクリアすると。ハイライトストロークは簡単には検出されません。 あなたの要件のために、の外にInkPresenterの新しいattributesを設定することができます。

private void SetHighLight() 
{ 
    InkDrawingAttributes drawingAttributes = 
inkCanvas.InkPresenter.CopyDefaultDrawingAttributes(); 
    InkDrawingAttributes attributes = new InkDrawingAttributes(); 
    attributes.PenTip = PenTipShape.Rectangle; 
    attributes.Size = new Size(4, 10); 
    attributes.Color = drawingAttributes.Color; 
    inkCanvas.InkPresenter.UpdateDefaultDrawingAttributes(attributes); 
} 

DrawInkを呼び出す前に新しいレイヤーを追加し、不透明度を与えました。そして、あなたはハイライターを使用しているように、ハイライト用に0.5不透明度のinkCanvasを特別に作成しました。

private void GetCanvasRender(out CanvasRenderTarget renderTarget, float opacity) 
{ 
    CanvasDevice device = CanvasDevice.GetSharedDevice(); 
    renderTarget = new CanvasRenderTarget(device, (int)ink.ActualWidth, (int)ink.ActualHeight, 96); 
    using (var ds = renderTarget.CreateDrawingSession()) 
    { 
     ds.Clear(Colors.Transparent); 
     using (ds.CreateLayer(opacity)) 
     { 
      ds.DrawInk(ink.InkPresenter.StrokeContainer.GetStrokes()); 
     } 
    } 
} 
+0

ありがとう、素敵な回避策! – andreask

関連する問題