2

私はcairo_surface_tフォーマットを持っていますCAIRO_FORMAT_A8。サーフをグレースケール画像として書き出したいので、すべてのピクセルは type の 1 バイト値を持ちますuchar

cairo_surface_write_to_png表面に直接使用するとCAIRO_FORMAT_A8、真っ黒な画像しか得られません。これは、cairo が A8 サーフェスをグレースケール データではなくアルファ値として内部的に処理する方法だと思います。ただし、単一のグレースケール画像が必要です。

誰かが A8 フォーマットを RGB24 画像の 3 つのレイヤーすべてにコピーする方法を指摘してくれれば十分でしょう。

どんな助けでも大歓迎です!

4

1 に答える 1

2

以下の未テストのコード。アイデアは、ARGB サーフェスを作成し、そこに cairo_mask_surface() を介して A8 サーフェスを「コ​​ピー」することです。色が「交換」されている場合は、2 つの 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);
于 2013-10-23T19:33:11.490 に答える