通用Windows可以动态地绘制图形和保存图像

universal windows draw graphics and save image on the fly

本文关键字:图形 保存 图像 绘制 Windows 动态 通用      更新时间:2023-10-16

我正在用c++开发一个通用的Windows 10应用程序,需求是这样的-有三角形/矩形/等的规范。比如坐标,边框宽度,边框颜色等等。现在,我需要创建一个图像,这样指定的三角形就可以绘制在它上面,然后将图像保存到一个临时位置。

我尝试过第三方库,如ImageMagick,但不能使用它,因为首先我正在开发一个通用应用程序,所以它需要是跨平台的,其次,它是太大的一个库适合应用程序。

我也看了看Win2D,但它也需要一个Canvas元素放在UI上。此外,绘图需要在绘制事件处理程序中完成,但我想在飞行中做,如Image2D getTriangle(double x1, double y1, double x2, double y2, double x3, double y3, Color color)

  1. 我看了看Android应用开发,他们有一个叫"Android .graphics"的东西。可以使用的油漆。Universal Windows SDK中是否有我可以利用的东西?

  2. 我真的不想创建一个XAML元素。原因-它需要加载到UI之前,我可以使用它(技术上,需要去"布局通过"),我不想在屏幕上显示它-只是保存在磁盘上的图像。

  3. 像通用Windows一样,它应该能够在通用Windows支持的所有平台上运行,如Windows Phone, Surface, PC等

我终于找到了我的问题的解决方案,希望它能指导其他在这里绊倒的人。用于在通用Windows应用程序中动态创建图像的库仍然是Win2D。但是,当Direct2D在屏幕上写入图像时,在Win2D中有一个屏幕外绘图库,可以帮助绘制图像到文件。本质上,我们使用CanvasRenderTarget创建渲染目标,并使用CanvasDrawingSession绘制。完成后,我们使用SaveAsync将图像保存到磁盘。

Win2D也可以作为nuGet包使用,因为它是一个带有。uwp包的微软项目,它似乎可以在通用Windows目标的所有平台上运行。

示例代码-

CanvasDevice^ device = CanvasDevice::GetSharedDevice();
CanvasRenderTarget^ offscreen = ref new CanvasRenderTarget(device, width, height, 96);
{
    CanvasDrawingSession^ ds = offscreen->CreateDrawingSession();
    ds->Clear(Colors::Black);
    ds->DrawRoundedRectangle(Rect (0, 0, 100, 100), 0, 0, Colors::White);
}
offscreen->SaveAsync(filepath)

您可能会设法将您的规范转换为xml/svg格式(如果还没有这种情况),然后渲染和保存与一些QT库:

http://doc.qt.io/qt-5/qsvgrenderer.html

QSvgRenderer类用于绘制SVG文件的内容

http://doc.qt.io/qt-5/qimage.html

QImage类提供了一个独立于硬件的图像表示

  • 创建SVG xml文本与您的规范
  • 或者,直接使用QPainter
  • 绘制内容
  • 将QImage保存为任意格式