如何使用cairo将图像写入SVG文件
How do I write an image into an SVG file using cairo?
我有一些代码看起来像这样:
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所期望的格式。由于您的两个输出都已损坏,这强烈表明问题出在输入。
相关文章:
- .cpp和.h文件中的模板专用化声明
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 文本文件中的单词链表
- CMake-按正确顺序将项目与C运行时对象文件链接
- 使用新行和不使用新行读取文件
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 挂起和取消挂起一个文件DLL
- 如何确定我已使用非编码文件到达 EOF?
- 命名空间中具有.h和.cpp文件的类
- 如何使用ndk-build.cmd构建Android.so文件
- 从包含m行的文件中提取n行,必要时(惰性地)重复该文件
- 读取文件并输入到矢量中
- 在C++中查找文件
- c++库的公共头文件中应该包含什么
- 用c++从输入文件中读取另一行
- 在 Win32 (C++) 中打开、操作和呈现 SVG 文件
- 如何将SVG文件转换为等效的GDI+对象
- 使用C/ c++打开和编辑SVG文件
- 如何使用cairo将图像写入SVG文件
- 使用 QPainter 渲染 SVG 文件