2016-04-04 7 views
3

ハイライトストロークをpngとして保存しようとしています。私はこの作業をするためにUWPのためにwin2dを使用しています。 100%の不透明度のストロークでうまく動作しますが、DrawAsHighlighter = true;を設定すると、保存されたpngは空白になり、完全に透明になります。ここでwin2D uwpはインクキャンバスにハイライトストロークを保存しません

は私のコードです:

private void SetHighLight() 
    { 
     InkDrawingAttributes attributes = new InkDrawingAttributes(); 
     attributes.DrawAsHighlighter = true; 
     attributes.PenTip = PenTipShape.Rectangle; 
     attributes.Size = new Size(4, 10); 
     attributes.Color = currentColor; 
     SetAttribute(attributes); 
    } 

    private void GetCanvasRender(out CanvasRenderTarget renderTarget) 
    { 
     CanvasDevice device = CanvasDevice.GetSharedDevice(); 
     renderTarget = new CanvasRenderTarget(device, (int)ink.ActualWidth, (int)ink.ActualHeight, 96); 
     using (var ds = renderTarget.CreateDrawingSession()) 
     { 
      ds.Clear(Colors.Transparent); //I already tried to delete this but it doesn't change anything 
      ds.DrawInk(ink.InkPresenter.StrokeContainer.GetStrokes()); 
     } 
    } 

    private async void SavePicture() 
    { 
     CanvasRenderTarget renderTarget; 
     Image img = new Image(); 

     GetCanvasRender(out renderTarget); 
     StorageFolder storageFolder = ApplicationData.Current.LocalFolder; 
     StorageFile noteFile = await storageFolder.CreateFileAsync(i.ToString() + ".png", CreationCollisionOption.ReplaceExisting); 
     using (var fileStream = await noteFile.OpenAsync(FileAccessMode.ReadWrite)) 
      await renderTarget.SaveAsync(fileStream, CanvasBitmapFileFormat.Png, 1f); 
     img.Source = new BitmapImage(new Uri(storageFolder.Path + "/" + i++ + ".png")); 
     img.VerticalAlignment = VerticalAlignment.Stretch; 
     ContainerCanvas.Children.Add(img); 
     Canvas.SetTop(img, ScrollViewerContainer.VerticalOffset); 
     Canvas.SetZIndex(img, 5); 
    } 

私はそれがためにハイライトのビジュアルツリーには存在しないかもしれない読んだが、私は本当にそれについてはよく分かりません。

ところで、色の不透明度を変更しようとすると(attributes.Color = Color.FromArgb(128, 255, 0, 0))、inkcanvasはアルファを適用しません、なぜですか?何か不足していますか?背景色で、その値を掛けているようだとして、蛍光ペンは、透明な背景の上に表示されていない

ds.Clear(Colors.White); 

答えて

0

私はついにそれを動作させる方法を考え出しました。 DrawInkを呼び出す前に新しいレイヤーを追加して不透明度を与え、attributes.DrawAsHighlighter = true;を取り除いただけです。代わりに、私はあなたがハイライトを使用しているように見える、ハイライト用の0.5不透明度を持つ1つのinkCanvasを特別に作成しました。

ここでは、コードです:

private void SetHighLight() 
{ 
    InkDrawingAttributes attributes = new InkDrawingAttributes(); 
    attributes.PenTip = PenTipShape.Rectangle; 
    attributes.Size = new Size(4, 10); 
    attributes.Color = currentColor; 
    SetAttribute(attributes); 
} 

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()); 
     } 
    } 
} 

private async void SavePicture(float opacity) 
{ 
    CanvasRenderTarget renderTarget; 
    Image img = new Image(); 

    GetCanvasRender(out renderTarget, opacity); 
    StorageFolder storageFolder = ApplicationData.Current.LocalFolder; 
    StorageFile noteFile = await storageFolder.CreateFileAsync(i.ToString() + ".png", CreationCollisionOption.ReplaceExisting); 
    using (var fileStream = await noteFile.OpenAsync(FileAccessMode.ReadWrite)) 
     await renderTarget.SaveAsync(fileStream, CanvasBitmapFileFormat.Png, 1f); 
    img.Source = new BitmapImage(new Uri(storageFolder.Path + "/" + i++ + ".png")); 
    img.VerticalAlignment = VerticalAlignment.Stretch; 
    ContainerCanvas.Children.Add(img); 
    Canvas.SetTop(img, ScrollViewerContainer.VerticalOffset); 
    Canvas.SetZIndex(img, 5); 
} 
0

はとキャンバスの背景をクリアしてみてください。

+0

は、こんにちは、あなたの答えのための おかげで、私は背景を透明にする必要があります。さらに、白い背景では、もはや不透明度を見ることができません: '( – Kinemu

+0

不透明な画像を受け取った後、完全に白い各ピクセルを取り除いた後、キャンバスのすべての非透明ピクセルをあなたが望む色(非不透明な色) – Dean

+0

@Deanこの問題は、ラインのスムージングのために、このような画像が白以外の背景にレンダリングされたときに、ストロークの周りに白いアーチファクトが発生する可能性があります。キネム、私はあなたがハイライターを使用できるとは思わない。通常の描画にはカスタムブラシを作成するか、Win2Dで対応するインクの描画を自分で管理する必要があります。 – SebastianR

2

DrawAsHighlighterのインクを.pngのようなビットマップ形式で保存することはできません。これは基本的に試行する意味のある操作ではありません。

標準的なアルファブレンディングを使用して、通常の非ハイライターインクが描画されるため、これらのインクシェイプだけをビットマップ形式で書き込むことは妥当です。後でそのビットマップを他の背景イメージにブレンドし、その背景に直接描画された場合と同じ結果を得ることができます。

しかし、ハイライターインクの場合、「背景の上のブレンド」は、標準のソースオーバーブレンドだけでなく、より複雑な操作です。したがって、このインクだけを含むビットマップイメージなどはありません。適切なブレンドを実行するためにバックグラウンドを用意する必要もあります。

あなたはここに3つのオプションがあります。

  1. highligherインクモードを使用しないでくださいを。
  2. インクをビットマップイメージとして保存する代わりに、元のインクストロークデータを保存し、インキングAPIを使用して後でこれらのストロークを最終的な場所に直接ブレンドします。
  3. 背景とインクストロークを同じビットマップに含めます。
関連する問題