2016-04-04 16 views
3

Ich versuche verzweifelt, einen Highlight-Strich als PNG zu speichern. Ich benutze win2d für UWP, um diese Arbeit zu machen. Es funktioniert gut für Striche mit 100% Deckkraft, aber wenn ich DrawAsHighlighter = true; setze, ist das gespeicherte PNG leer, vollständig transparent.win2D Uwp speichert keinen Hervorhebungsstrich in einem Inkcanvas

Hier ist mein Code:

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

ich gelesen habe es wegen der Höhepunkt möglicherweise nicht in der visuellen Struktur vorhanden ist, aber ich bin wirklich darüber nicht sicher.

Übrigens, wenn ich versuche, die Opazität einer Farbe zu ändern (attributes.Color = Color.FromArgb(128, 255, 0, 0)), die Inkcanvas nicht das Alpha, warum? Fehle ich etwas?

Antwort

0

Ich endlich herausgefunden, wie es funktioniert. Ich habe einfach eine neue Schicht vor dem Aufruf DrawInk hinzugefügt und gab ihm eine Opazität, und wurde attributes.DrawAsHighlighter = true; los. Stattdessen habe ich speziell für den Textmarker 1 inkCanvas mit einer Deckkraft von 0,5 gemacht, so als ob du einen Highlighter verwendest.

Hier ist der Code:

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

Versuchen Sie, den Hintergrund der Leinwand Clearing mit:

ds.Clear(Colors.White); 

Der Textmarker nicht sichtbar auf transparentem Hintergrund ist, wie es seinen Wert mit der Hintergrundfarbe zu multiplizieren scheint.

+0

Hallo, Vielen Dank für Ihre Antwort, aber ich brauche den Hintergrund transparent zu sein. Außerdem, mit weißem Hintergrund, können Sie die Opazität nicht mehr sehen: '( – Kinemu

+0

) Vielleicht können Sie das nicht transparente Bild erhalten, dann entfernen Sie jedes Pixel, das vollständig weiß ist, und dann ersetzen Sie jedes nicht transparente Pixel der Leinwand mit die gewünschte Farbe (nicht deckende Farbe) – Dean

+0

@Dean Das Problem damit könnte sein, dass aufgrund der Linienglättung weiße Artefakte um einen Strich entstehen, wenn ein Bild wie dieses auf einem nicht weißen Hintergrund gerendert wird.Kinemu, ich glaube nicht, dass du den Highlighter dann benutzen kannst. Sie müssen wahrscheinlich einen benutzerdefinierten Pinsel für das normale Zeichnen erstellen oder die Zeichnung der entsprechenden Tinte mit Win2D selbst verwalten. – SebastianR

2

Sie können DrawAsHighlighter-Tinte nicht in einem Bitmap-Format wie .png speichern - das ist im Grunde genommen keine sinnvolle Operation.

Normale Nicht-Textmarker-Tinte wird mit Standard-Alpha-Blending gezeichnet, daher ist es sinnvoll, nur diese Tintenformen in ein Bitmap-Format zu schreiben. Sie können diese Bitmap später über ein anderes Hintergrundbild mischen und erhalten das gleiche Ergebnis, als ob die Tinte direkt über diesen Hintergrund gezeichnet wurde.

Bei Textmarkertinte ist die "Überblendung über den Hintergrund" jedoch eine komplexere Operation, nicht nur die standardmäßige Überblendung. Es gibt also kein Bitmap-Bild, das nur diese Tinte enthält - Sie müssen auch einen Hintergrund bereitstellen, damit die entsprechende Mischung ausgeführt werden kann.

Sie haben hier drei Möglichkeiten:

  1. Verwenden highligher Tintenmodus nicht.
  2. Anstatt Ihre Tinte als Bitmap-Bild zu speichern, speichern Sie die ursprünglichen Strichdaten und verwenden Sie die Farbauftrags-APIs, um diese Striche später direkt an den endgültigen Speicherort zu mischen.
  3. Fügen Sie den Hintergrund sowie die Tintenstriche in derselben Bitmap ein.