使用一个 QPainter 一次绘制多个输出:SVG 和 QImage
Use one QPainter to paint multiple outputs at once: SVG and 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 组件并将其光栅化到另一个绘画设备,然后移动到下一个,但这可能并不简单,也很难做到值得。
只需简要说明您目前拥有的两种解决方案并坚持使用速度更快的解决方案,看起来第一种可能更有效。
我的 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 组件并将其光栅化到另一个绘画设备,然后移动到下一个,但这可能并不简单,也很难做到值得。
只需简要说明您目前拥有的两种解决方案并坚持使用速度更快的解决方案,看起来第一种可能更有效。