通用 windows 绘制图形并即时保存图像
universal windows draw graphics and save image on the fly
我正在用 C++ 开发通用 Windows 10 应用程序,要求是这样的 - 有 triangle/rectangle/etc 的规范。例如坐标,边框宽度,边框颜色等。现在,我需要创建一个图像,以便可以在其上绘制指定的三角形,然后将图像保存到一个临时位置。
我尝试过像 ImageMagick 这样的第 3 方库,但无法使用它,因为首先我正在开发一个通用应用程序,因此它需要跨平台,其次它太大了适合应用程序的库。
我也看了Win2D,但它还需要一个Canvas元素放在UI上。另外,在那里绘制需要在 Draw 事件处理程序中完成,但我想即时进行,比如 Image2D getTriangle(double x1, double y1, double x2, double y2, double x3, double y3, Color color)
.
我研究了 Android 应用程序开发,他们有一个叫做 "android.graphics.Paint" 的东西可以使用。 Universal Windows SDK 中有我可以利用的东西吗?
我真的不想创建 XAML 元素。原因 - 它需要在 UI 上加载才能使用(从技术上讲,需要加载 "layout pass")并且我不想在屏幕上显示它 - 只需将图像保存在磁盘上。
像UniversalWindows一样,它应该可以在UniversalWindows支持的所有平台上运行,像WindowsPhone ]、Surface、PC等
您或许可以设法将您的规范转换为 xml/svg 格式(如果不是这样的话),然后使用某些 QT 库进行渲染和保存:
http://doc.qt.io/qt-5/qsvgrenderer.html
The QSvgRenderer class is used to draw the contents of SVG files
http://doc.qt.io/qt-5/qimage.html
The QImage class provides a hardware-independent image representation
- 根据您的规范创建 SVG xml 文本
- 或者,使用 QPainter 直接绘制您的内容
- 以您选择的任何格式保存 QImage。
我终于找到了问题的解决方案,希望它能指导其他在这里跌跌撞撞的人。
用于在 Universal Windows App 中动态创建图像的库仍然是 Win2D。但是当 Direct2D 在屏幕上写入图像时,Win2D 中有一个 offscreen drawing library 可以帮助将图像绘制到文件中。本质上,我们使用 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)
我正在用 C++ 开发通用 Windows 10 应用程序,要求是这样的 - 有 triangle/rectangle/etc 的规范。例如坐标,边框宽度,边框颜色等。现在,我需要创建一个图像,以便可以在其上绘制指定的三角形,然后将图像保存到一个临时位置。
我尝试过像 ImageMagick 这样的第 3 方库,但无法使用它,因为首先我正在开发一个通用应用程序,因此它需要跨平台,其次它太大了适合应用程序的库。
我也看了Win2D,但它还需要一个Canvas元素放在UI上。另外,在那里绘制需要在 Draw 事件处理程序中完成,但我想即时进行,比如 Image2D getTriangle(double x1, double y1, double x2, double y2, double x3, double y3, Color color)
.
我研究了 Android 应用程序开发,他们有一个叫做 "android.graphics.Paint" 的东西可以使用。 Universal Windows SDK 中有我可以利用的东西吗?
我真的不想创建 XAML 元素。原因 - 它需要在 UI 上加载才能使用(从技术上讲,需要加载 "layout pass")并且我不想在屏幕上显示它 - 只需将图像保存在磁盘上。
像UniversalWindows一样,它应该可以在UniversalWindows支持的所有平台上运行,像WindowsPhone ]、Surface、PC等
您或许可以设法将您的规范转换为 xml/svg 格式(如果不是这样的话),然后使用某些 QT 库进行渲染和保存:
http://doc.qt.io/qt-5/qsvgrenderer.html
The QSvgRenderer class is used to draw the contents of SVG files
http://doc.qt.io/qt-5/qimage.html
The QImage class provides a hardware-independent image representation
- 根据您的规范创建 SVG xml 文本
- 或者,使用 QPainter 直接绘制您的内容
- 以您选择的任何格式保存 QImage。
我终于找到了问题的解决方案,希望它能指导其他在这里跌跌撞撞的人。 用于在 Universal Windows App 中动态创建图像的库仍然是 Win2D。但是当 Direct2D 在屏幕上写入图像时,Win2D 中有一个 offscreen drawing library 可以帮助将图像绘制到文件中。本质上,我们使用 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)