如何写出一个灰度级的cairo曲面到PNG

时间:2013-10-22 17:26:47

标签: c gtk glib cairo gobject

我的cairo_surface_t格式为CAIRO_FORMAT_A8。我想将surfe写成灰度图像,因此每个像素都有uchar类型的单字节值。

如果我直接在cairo_surface_write_to_png表面上使用CAIRO_FORMAT_A8,我得到的只是全黑图像。我认为这就是cairo内部处理A8表面的方式 - 作为alpha值,而不是灰度数据。不过,我想要一张灰度图像。

如果有人指出如何将A8格式复制到RGB24图像的所有3层,我就足够了。

任何帮助表示赞赏!

1 个答案:

答案 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);