Как записать каирскую поверхность в оттенках серого в PNG

У меня cairo_surface_t формата CAIRO_FORMAT_A8. Я хочу записать поверхность как изображение в оттенках серого, чтобы каждый пиксель имел однобайтовое значение типа uchar.

Если я использую cairo_surface_write_to_png прямо на CAIRO_FORMAT_A8 поверхности, все, что я получаю, - это полностью черное изображение. Я думаю, что именно так cairo внутренне обрабатывает поверхность A8 - как альфа-значения, а не как данные в градациях серого. Однако мне нужно одно изображение в оттенках серого.

Мне было бы достаточно, если бы кто-нибудь подсчитал, как скопировать формат A8 на все 3 слоя изображения RGB24.

Любая помощь приветствуется!


person Dynalon    schedule 22.10.2013    source источник


Ответы (1)


Непроверенный код ниже. Идея состоит в том, чтобы создать ARGB-поверхность и «скопировать» туда поверхность A8 с помощью cairo_mask_surface (). Если цвета «поменялись местами», поменяйте местами два вызова cairo_set_source_rgb ().

cairo_surface_t *s = YOUR_A8_SURFACE;
cairo_t *cr = cairo_create(s);
cairo_push_group_with_content(cr, CAIRO_CONTENT_COLOR_ALPHA);
cairo_set_source_rgb(cr, 1, 1, 1);
cairo_paint(cr);
cairo_set_source_rgb(cr, 0, 0, 0);
cairo_mask_surface(cr, cairo_get_target(cr), 0, 0);
cairo_surface_write_to_png(cairo_get_group_target(cr), "/tmp/foo.png");
/* If you want to continue using the context:
   cairo_pattern_destroy(cairo_pop_group(cr)); */
cairo_destroy(cr);
person Uli Schlachter    schedule 23.10.2013
comment
Одна небольшая опечатка в вашем коде, вторая строка аргумента cairo_create должна быть поверхностью s - person Dynalon; 24.10.2013