【问题标题】:How to render InkCanvas to an image in UWP Windows 10 application?如何将 InkCanvas 渲染到 UWP Windows 10 应用程序中的图像?
【发布时间】:2015-11-16 04:46:36
【问题描述】:

RenderTargetBitmap 类与简单的 Canvas + InkManager(在 Windows 8.1 中)一起使用,将墨水笔触渲染到图像。 UWP 引入了InkCanvas 和新的墨迹 API。但是,RenderTargetBitmap 似乎不适用于此。当我尝试使用RenderAsync 方法捕获墨迹时,没有墨迹只呈现其他对象,如矩形等。

这是一个错误还是这个新的 API 不适合以这种方式使用?如果没有,那么我如何从InkCanvas 渲染图像?

谢谢!

【问题讨论】:

  • [inkCanvas].InkPresenter.StrokeContainer.SaveAsync 可以另存为 .gif
  • 是的,我知道这一点。但是,我猜它是嵌入在 .gif 中的 ISF(墨迹格式)。打开时gif本身非常难看,我不能使用它。我绝对想使用 RenderTargetBitmap,但它没有按预期工作。我还尝试使用 BitmapDecoder 解码 gif,获取像素数据并使用 BitmapEncoder 将其编码为另一种格式,但也没有运气(它只包含零,整个图像是黑色的)。例如,我真正想要的是用白色背景渲染一个 png 或 jpg 图像。也许以后操纵它。有人可以帮忙吗?
  • 我试图回到旧的 InkManager + Canvas 组合,但 InkManager 在实例化时抛出 COM Exception。
  • 好的,我将有一个包含 Win2D(Microsoft 的 Direct2D .NET 包装器)的解决方案。 Win2D 可以通过 nuget 包在 UWP 应用程序中使用。非常好的东西。我设法用这个将墨水笔画保存到图像(jpeg、png 和其他格式)。
  • @mudbox,我建议您将发现的内容写到答案中,以便对其他人有所帮助。

标签: c# xaml uwp inkcanvas rendertargetbitmap


【解决方案1】:

这是我用 Win2D 解决这个问题的方法。 首先,将Win2D.uwp nuget 包添加到您的项目中。 然后使用此代码:

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(inkCanvas.InkPresenter.StrokeContainer.GetStrokes());
}

using (var fileStream = await file.OpenAsync(FileAccessMode.ReadWrite))
    await renderTarget.SaveAsync(fileStream, CanvasBitmapFileFormat.Jpeg, 1f);

【讨论】:

  • 你能解释一下代码吗?目前还不清楚。我想绘制从文件中挑选的图像..
  • 您需要知道的一切都在这里。请浏览内容。 microsoft.github.io/Win2D/html/Introduction.htm 如果您想绘制图像: 1. 确保将 Win2D.uwp 块包添加到您的项目中(据我所知,它仅适用于 UWP) 2. 您需要 XAML 中的 CanvasControl <canvas:CanvasControl x:Name="canvas" ClearColor="White" CreateResources="CanvasControl_CreateResources" Draw="CanvasControl_Draw"/>
  • 3.由于加载位图是异步的,因此您需要 this trick
  • 谢谢!只是为了澄清我的意思是在图像上绘制笔画并将其与笔画保存为同一个文件。
  • 然后你需要一个控件来保存 XAML 中的图像(例如:图像、画布等)。您还需要一个位于图像控件之上的 InkCanvas (UWP) 控件。如果您不需要在 UI 中显示最终渲染的图像,您可以"offset draw"。您只需要从控件中获取要绘制为背景的图像源(我不知道这部分,也许您必须转换为位图),然后在绘图会话中加载并调用DrawImage。在同一会话中,您使用DrawInk 绘制墨水笔触。
【解决方案2】:

【讨论】:

  • 欢迎来到 Stack Overflow!虽然这在理论上可以回答问题,it would be preferable 在此处包含答案的基本部分,并提供链接以供参考。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-02
  • 1970-01-01
  • 2016-09-15
  • 1970-01-01
  • 1970-01-01
  • 2016-02-21
  • 2018-07-06
相关资源
最近更新 更多