Как мне записать изображение в файл SVG, используя cairo? - PullRequest
10 голосов
/ 29 июля 2011

У меня есть код, который выглядит следующим образом:

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.

РЕДАКТИРОВАТЬ: Забыли предоставить информацию о версии. Каир 1.10.2, как указано в cairo_version_string (). g ++ 4.52 Работает на Ubuntu 11.04

РЕДАКТИРОВАТЬ (2): Хорошо, я проследил это до проблем с PNG cairo и обнаружил, что cairo_surface_write_to_png не ведет себя так, как ожидалось. И эта функция, и попытка встроить изображение в SVG вызывают «ошибки нехватки памяти», а я до сих пор не знаю, почему.

Ответы [ 3 ]

2 голосов
/ 04 августа 2011

Похоже, вы забыли указать версию SVG следующим образом:

cairo_svg_surface_restrict_to_version (surface, CAIRO_SVG_VERSION_1_2);

Это можно сделать сразу после создания поверхности.

0 голосов
/ 23 сентября 2011

Я не могу найти cairo_image_surface_for_data в Каирской документации. Вы имели в виду cairo_image_surface_create_for_data ? Если это так, вам нужно использовать cairo_format_stride_for_width для вычисления размера массива, и данные растрового изображения должны быть в формате, который ожидает Каир. Поскольку оба ваших выхода повреждены, это настоятельно указывает на проблему с input .

0 голосов
/ 11 сентября 2011

Возможно, публикация полученного простого SVG-файла может помочь.

...