使用一个QPainter一次绘制多个输出:SVG和QImage

菲利普

我的Qt应用程序使用QPainter绘制矢量图形。我需要两次此图形输出,一次是作为SVG格式的矢量输出(在此我使用QSvgGenerator),一次是一个像素格式(在此我使用QImage)。根据我在文档中找到的内容,我可以先将其绘制为SVG,然后将SVG输出转换为Qimage:

QPainter painter;
QSvgGenerator generator;
generator.setSize(QSize(width_, height_));
// more initializations here
painter.begin(&generator);
doPaintMyStuff(&painter);
painter.end();
generator.setOutputDevice(...)   // pipe the SVG output to the server
QImage image(width_, height_, QImage::Format_ARGB32_Premultiplied);
QSvgRenderer renderer;
renderer.load(...)                // get the svg output we just generated
painter.begin(&image);
renderer.render(&painter);       // render the vector graphic to pixel
painter.end();
usePixelData(image.constBits()); // pipe the pixel output to the server

或使用两个不同的后端绘制两次:

QPainter painter;
QSvgGenerator generator;
generator.setSize(QSize(width_, height_));
// more initializations here
QImage image(width_, height_, QImage::Format_ARGB32_Premultiplied);
painter.begin(&generator);
doPaintMyStuff(&painter);
painter.end();
painter.begin(&image);
doPaintMyStuff(&painter);
painter.end();
generator.setOutputDevice(...)   // pipe the SVG output to the server
usePixelData(image.constBits()); // pipe the pixel output to the server

两种解决方案都可以使用,但是对我来说似乎效率都非常低,因为我总是在同一场景中绘制两次。后者调用QPainter上的所有函数两次,前者通过重新跟踪我刚生成的SVG输出来再次绘制所有操作。

有没有一种方法可以将多个后端连接到一个QPainter来仅绘制一次整个场景?

德泰

我认为您无法立即获得想要的东西。您可以研究一下painter的私有实现,并想出一种可以一次完成所有操作的方法-生成每个矢量painter组件并将其栅格化到另一个绘画设备,然后再移动到下一个绘画设备,但这可能并不简单并且几乎不可能值得。

只需介绍到目前为止的两个解决方案,并坚持使用较快的解决方案,看起来第一个解决方案可能会更高效。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

SVG使用多个,一次加载

如何在多个csv文件中一次按行查找(并输出)第一个值1和最后一个值1的位置?

动态绘制要在一组轴上显示的多个图(一次绘制一个图)

一次引入多个文件时,R只输出最后一个文件的数据

Pygame一次只绘制一个“按钮”

使进程一次在python中输出一个

函数一次仅返回一个输出

使用 Mapbox-GL-Draw 一次只允许绘制一个形状

如何在另一次迭代中使用一个循环的输出?

多个Divs一次显示/隐藏一个

是否可以一次引用一个svg文件,然后多次使用它?

使用JavaScript一次为一个元素设置多个属性

如何使用Scrapy一次运行一个蜘蛛的多个版本?

如何使用一个热键一次关闭/打开多个程序?

使用 C++ 一次将多个元素传递给一个向量

指定 R 在使用“...”传递多个参数时一次接受一个参数

一次绘制多个图

一次绘制多个直方图

从多个线程中一次变异/读取一个HashMap,但一次只能一个线程

在一次通过的grep多个表达式,输出匹配到在单独的文件中的每一个表达

使用 jQuery 限制复选框(一次一个类别和一个子类别)

使用canvas,getImageData和Web Worker一次对一个图块采样一个图像

使用Reactjs和Bootstraps一次显示一个折叠内容

如何使用angular2一次隐藏和显示一个弹出窗口

使用JavaScript一次显示一个<p>

使用CSS一次显示一个跨度

使用queqe一次启动一个线程

使用afnetworking一次下载一个文件

使用AutoHotkey一次发送和释放多个密钥