3

我拼命地试图将高亮笔画保存为png。我正在为 UWP 使用 win2d 来完成这项工作。它适用于 100% 不透明度的笔触,但是当我设置 时DrawAsHighlighter = true;,保存的 png 是空的,完全透明。

这是我的代码:

    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 不应用 alpha,为什么?我错过了什么吗?

4

3 回答 3

2

您不能将 DrawAsHighlighter 墨水保存为 .png 之类的位图格式 - 这根本不是一个有意义的尝试操作。

常规的非荧光笔墨水是使用标准 Alpha 混合绘制的,因此仅将这些墨水形状写入位图格式是合理的。您可以稍后将该位图混合到其他背景图像上,并获得与直接在该背景上绘制墨水一样的结果。

然而,对于荧光笔墨水,“混合背景”是一个更复杂的操作,而不仅仅是标准的源混合。因此,不存在仅包含这种墨水的位图图像之类的东西 - 您还必须提供背景才能进行适当的混合。

您在这里有三个选择:

  1. 不要使用高亮墨水模式。
  2. 不要将墨迹保存为位图图像,而是保存原始墨迹笔触数据,然后使用墨迹 API 稍后将这些笔触直接混合到它们的最终位置。
  3. 在同一个位图中包括背景和墨迹。
于 2016-04-08T20:43:44.700 回答
0

尝试清除画布的背景:

ds.Clear(Colors.White);

荧光笔在透明背景上不可见,因为它似乎将其值与背景颜色相乘。

于 2016-04-04T08:25:25.713 回答
0

我终于想出了如何让它工作。我只是在调用之前添加了一个新图层DrawInk并给它一个不透明度,然后摆脱了attributes.DrawAsHighlighter = true;. 相反,我专门为荧光笔制作了 1 个不透明度为 0.5 的 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);
}
于 2016-05-30T15:16:20.083 回答