我的cairo_surface_t
格式为CAIRO_FORMAT_A8
。我想将surfe写成灰度图像,因此每个像素都有uchar
类型的单字节值。
如果我直接在cairo_surface_write_to_png
表面上使用CAIRO_FORMAT_A8
,我得到的只是全黑图像。我认为这就是cairo内部处理A8表面的方式 - 作为alpha值,而不是灰度数据。不过,我想要一张灰度图像。
如果有人指出如何将A8格式复制到RGB24图像的所有3层,我就足够了。
任何帮助表示赞赏!
答案 0 :(得分:1)
下面未经测试的代码。我们的想法是创建一个ARGB表面并通过cairo_mask_surface()在那里“复制”A8表面。如果颜色是“交换”的,则交换两个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);