【问题标题】:How do I write an image into an SVG file using cairo?如何使用 cairo 将图像写入 SVG 文件?
【发布时间】:2011-09-23 10:10:38
【问题描述】:

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

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_version_string() 给出的 Cairo 1.10.2。 g++ 4.52 在 Ubuntu 11.04 上运行

EDIT(2):好的,我已将其追溯到 cairo 的 PNG 问题,并发现 cairo_surface_write_to_png 的行为也不如预期。此功能和尝试在 SVG 中嵌入图像都会导致“内存不足错误”,我仍然不知道 为什么。

【问题讨论】:

    标签: c++ c svg cairo


    【解决方案1】:

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

    cairo_svg_surface_restrict_to_version (surface, CAIRO_SVG_VERSION_1_2);
    

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

    【讨论】:

    • 好的。查看上面的版本,这应该是CAIRO_SVG_VERSION_1_1。在PNG问题上,您可以cairo_image_surface_create_from_png()然后将表面写回新的PNG并让文件损坏吗?或者这是否正常工作?
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • @Scott,你还在吗?您是否尝试过 Seth 的从 png 加载源表面的建议?
      • 我完全忘记了这个问题,对不起。我没有解决它,但我发现带有 PNG 的 cairo 在我电脑上的其他项目中运行良好。我认为因为我在这个项目中同时链接了 Irrlicht 和 OpenCV,所以存在一些关于使用哪个版本的 libpng 的链接问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-12
      • 2019-07-04
      • 1970-01-01
      • 1970-01-01
      • 2022-11-07
      • 1970-01-01
      • 2012-06-14
      相关资源
      最近更新 更多