C 如何将灰度开罗曲面写入PNG

C 如何将灰度开罗曲面写入PNG,c,gtk,glib,cairo,gobject,C,Gtk,Glib,Cairo,Gobject,我有一个cairo\u-surface\t格式的cairo\u-A8。我想把表面写成灰度图像,这样每个像素都有一个单字节值,类型为uchar 如果我直接在cairo\u FORMAT\u A8曲面上使用cairo\u surface\u write\u to\u png,我得到的只是一张全黑图像。我认为这就是cairo内部如何将A8表面视为alpha值,而不是灰度数据。不过,我想要一张灰度图像 如果有人指出如何将A8格式复制到RGB24图像的所有3层,我就足够了 感谢您的帮助 下面是未测试的代码

我有一个
cairo\u-surface\t
格式的
cairo\u-A8
。我想把表面写成灰度图像,这样每个像素都有一个单字节值,类型为
uchar

如果我直接在
cairo\u FORMAT\u A8
曲面上使用
cairo\u surface\u write\u to\u png
,我得到的只是一张全黑图像。我认为这就是cairo内部如何将A8表面视为alpha值,而不是灰度数据。不过,我想要一张灰度图像

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


感谢您的帮助

下面是未测试的代码。其想法是创建一个ARGB曲面,并通过cairo_mask_surface()将A8曲面“复制”到该曲面。如果颜色被“交换”,则交换两个cairo\u set\u source\u rgb()调用


代码中的一个小错误,第二行
cairo\u create
的参数必须是surface
s
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);