将 Surface 转换为矢量化 SVG 而不是嵌入的 PNG

Convert Surface to vectorized SVG instead of embedded PNG

对于上下文,我正在尝试 gtk custom drawing example。我想将 Surface(在我的例子中是 xlib 表面)转储到 SVG 文件中,并获得实际的矢量图像,而不是嵌入的 PNG。

例如:

cairo_surface_t *svg_surface;
svg_surface = cairo_svg_surface_create("/path/myfile.svg", 200, 200);
cairo_t *cr;
cr = cairo_create(svg_surface);
cairo_set_source_surface(cr, surface, 0, 0);
cairo_paint(cr);
cairo_surface_flush(svg_surface);
cairo_surface_finish(svg_surface);

生成内容如下的 SVG:

<svg ...>
<image ... xlink:href="data:image/png;base64,iVBORw0K...>
</svg>

绘制成SVG,例如:

cairo_move_to(svg_surface, 0, 0)
cairo_line_to(svg_surface, 100, 100)
cairo_stroke(svg_surface)

产生:

<svg ...>
<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 10 10 L 100 100 "/>
</svg>

有没有办法将原始表面绘制成 SVG,并获得这样的输出,而不是嵌入的 PNG?

我知道我可以记录在原始表面上完成的所有绘图操作,然后将它们重播到 SVG 中,但我希望有更好的方法来做到这一点。如果不是,那做不到的根本原因是什么?

I know I can record all the drawing operations done in the original surface and then replay them into the SVG, but I'm hoping there is a better way to do that. If not, what's the fundamental reason this cannot be done?

xlib 图面是指 X11 服务器上的可绘制对象(window 或像素图)。可绘制对象包含像素,因此这就是您可以从中获得的全部内容。

做你想做的事需要记录所有曾经失败的绘图操作,这会导致无限的内存使用。

您可以使用 cairo 记录表面来获取这样的日志,但这只会记录对该表面所做的绘图操作,而不是对另一个表面所做的绘图操作。如果可以的话,我建议您在想要获取 SVG 时再次调用执行实际绘图的代码。