将Surface转换为矢量化SVG,而不是嵌入式PNG。

问题描述 投票:0回答:1

对于背景,我正在尝试 gtk自定义绘图示例. 我想甩掉 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中,但我希望有更好的方法。如果没有,那么不能这样做的根本原因是什么?

gtk gtk3 cairo
1个回答
1
投票

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

xlib表面指的是X11服务器上的一个可绘制对象(可以是一个窗口,也可以是一个像素图)。一个可绘制对象包含了像素,所以这就是你能从它那里得到的所有东西。

做你想做的事需要保留所有曾经停止的绘图操作的日志,这将导致无限制的内存使用。

你可以使用开罗记录曲面来获得这样的日志,但这只能记录对这个曲面的绘图操作,而不能记录对另一个曲面的绘图操作。如果可以的话,我建议在你想得到SVG的时候,再调用你的做实际绘图的代码即可。

© www.soinside.com 2019 - 2024. All rights reserved.