如何使用cairo将图像写入SVG文件

How do I write an image into an SVG file using cairo?

本文关键字:SVG 文件 图像 何使用 cairo      更新时间:2023-10-16

我有一些代码看起来像这样:

cairo_surface_t * surface = cairo_svg_surface_create("0.svg", 512, 512);
cairo_t * context = cairo_create(surface);
int * data = new int[512*512];
// fill the data...
cairo_surface_t * image_surface = 
    cairo_image_surface_for_data(data, 512, 512, 512*4);
cairo_set_source_surface(context, image_surface, 0, 0);
cairo_paint(context);
// do some other drawing ...
cairo_surface_flush(surface);
cairo_surface_finish(surface);
cairo_surface_destroy(surface);
cairo_destroy(context);

然而,svg总是出现损坏。该图像未正确写入,并且随后的所有绘图命令都不起作用。将表面类型更改为PS,即:

cairo_surface_t * surface = cairo_ps_surface_create("0.ps", 512, 512);

生成一个完全正确的PS文档。如果能帮助修复SVG,我将不胜感激。

编辑:忘了提供版本信息。Cairo 1.10.2由cairo_version_string()给出。g + + 4.52在Ubuntu 11.04上运行

EDIT(2):好的,我已经将其追溯到cairo的PNG问题,并发现cairo_surface_write_to_png也不像预期的那样运行。这个函数和试图在SVG中嵌入图像都会导致"内存不足错误",我仍然不知道为什么。

看起来您可能忘记将SVG版本指定为:

cairo_svg_surface_restrict_to_version (surface, CAIRO_SVG_VERSION_1_2);

您可以在创建表面后立即执行此操作。

也许发布生成的纯SVG会有所帮助。

我在Cairo文档中找不到cairo_image_surface_for_data。你是说cairo_image_surface_create_for_data吗?如果是这样,则需要使用cairo_format_stride_for_width来计算数组大小,并且位图数据需要采用Cairo所期望的格式。由于您的两个输出都已损坏,这强烈表明问题出在输入