对于背景,我正在尝试 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中,但我希望有更好的方法。如果没有,那么不能这样做的根本原因是什么?
我知道我可以记录所有在原始曲面中完成的绘图操作,然后将它们重放到SVG中,但我希望有更好的方法。如果没有,那不能这样做的根本原因是什么?
xlib表面指的是X11服务器上的一个可绘制对象(可以是一个窗口,也可以是一个像素图)。一个可绘制对象包含了像素,所以这就是你能从它那里得到的所有东西。
做你想做的事需要保留所有曾经停止的绘图操作的日志,这将导致无限制的内存使用。
你可以使用开罗记录曲面来获得这样的日志,但这只能记录对这个曲面的绘图操作,而不能记录对另一个曲面的绘图操作。如果可以的话,我建议在你想得到SVG的时候,再调用你的做实际绘图的代码即可。