2011-07-29 14 views
10

que tienen un código que se parece a esto:¿Cómo escribo una imagen en un archivo SVG usando 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); 

Sin embargo, el SVG siempre parece dañado. La imagen no está escrita correctamente, y todos los comandos de dibujo siguientes no funcionan. Cambiar el tipo de superficie a PS, es decir:

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

produce un documento PS perfectamente correcto. Cualquier ayuda para arreglar el SVG sería apreciada.

EDITAR: Se olvidó de proporcionar la información de la versión. Cairo 1.10.2 dado por cairo_version_string(). g ++ 4.52 Correr en Ubuntu 11.04

EDITAR (2): Ok, he remontado esto a problemas PNG con El Cairo y descubrió que cairo_surface_write_to_png no se comporta como se esperaba tampoco. Tanto esta función como el intento de incrustar una imagen en un SVG provocan "errores de memoria", y todavía no sé por qué.

Respuesta

2

Parece que puede haber olvidado para especificar la versión SVG como:

cairo_svg_surface_restrict_to_version (surface, CAIRO_SVG_VERSION_1_2); 

Usted puede hacer esto inmediatamente después de crear la superficie.

+0

Gracias, pero esto no soluciona el problema. Ver mi publicación editar – Scott

+0

OK. En cuanto a su versión anterior, esta debería ser 'CAIRO_SVG_VERSION_1_1'. En el problema PNG, ¿puedes 'cair_image_surface_create_from_png()' y luego escribir la superficie en un PNG nuevo y hacer que el archivo se corrompa? ¿O esto funciona correctamente? – Seth

0

Tal vez publicar el SVG normal resultante puede ayudar.

0

No puedo encontrar cairo_image_surface_for_data en la documentación de El Cairo. ¿Quería decir cairo_image_surface_create_for_data? Si es así, debe usar cairo_format_stride_for_width para calcular el tamaño de la matriz, y los datos del mapa de bits deben estar en el formato que Cairo espera. Dado que ambas salidas están dañadas, esto sugiere que el problema está en la entrada .

+0

@Scott, ¿sigues ahí? ¿Has probado la sugerencia de Seth de cargar la superficie de origen desde un png? –

+0

Me olvidé por completo de esta pregunta, lo siento. No lo resolví, pero descubrí que el cairo con PNG funcionaba bien en otros proyectos en mi computadora. Creo que porque estaba vinculando tanto a Irrlicht como a OpenCV con este proyecto, que había algunos problemas de vinculación sobre qué versión de libpng usar. – Scott

Cuestiones relacionadas