2017-04-08 31 views
0

私はカイロを新しくして、透明な色とストロークでテキストを作成しようとしています。
ストロークカラーの透明度は機能しますが、テキストのカラー透過度はtransparency_valueではありません。 私はtransparency_valueを減らす場合は、テキストの色がちょうど暗い(黒)を取得し、transparency_valueが増加すると、テキストの色明るく(私の場合は緑)Cairo透明に塗りつぶし

cairo_surface_t* surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, 640, 480); 
cairo_t* cairo = cairo_create(surface); 
cairo_set_font_face(cairo, myfont_face); 
cairo_set_font_size(cairo, 25); 
cairo_text_extents_t extents; 
cairo_text_extents(cairo, "Hello World", &extents); 
cairo_move_to(cairo, 200, 200);   
cairo_text_path(cairo, "Hello World"); 
double transparency_value = 0.5; 
cairo_set_source_rgba(cairo, 0,1,0,transparency_value); //transparency doesn't work 
//cairo_fill(cairo); //this didn't make a difference 
cairo_fill_preserve(cairo); 
cairo_set_source_rgba(cairo, 0.56, 0.76, 0.96, 0.5); //transparency works 
cairo_set_line_width(cairo, 1.5); 
cairo_stroke(cairo); 

答えて

1

が、それはあなたが表面の外にあなたのテキストを描画していることが考えられますか?次の例では、cairo_move_to(cr, 200, 200)への呼び出しを追加しましたが、次の結果が得られました。 (これはLuaの中で書かれており、カイロに呼び出すためにhttps://github.com/pavouk/lgiを使用します。コメントは、私はあなたのバージョンと比較して変化の事を示している)

local cairo = require("lgi").cairo 
local surface = cairo.ImageSurface.create(cairo.Format.ARGB32, 640, 480) 
local cr = cairo.Context(surface) 
local myfont_face = cr:get_font_face() -- I have to get this from somewhere 
cr:move_to(200, 200) -- I added this line to make something appear 
cr:set_font_face(myfont_face) 
cr:set_font_size(25) 
cr:text_path("Hello World") 
local transparency_value = 0.5 
cr:set_source_rgba(0, 1, 0, transparency_value) 
-- cr:fill() 
cr:fill_preserve() 
cr:set_source_rgba(0.65, 0.76, 0.96, 0.5) 
cr:set_line_width(5) -- changed from 1.5 to 5 to make it more prominent 
cr:stroke() 
surface:write_to_png("/tmp/out.png") 

enter image description here

編集を:私は0.1にtransparency_valueを変更したときに、これは結果であり、 。明らかに、結果は異なり、透明度は正しく機能します(ズームインすると、途中で微妙な緑色が表示されます)。

enter image description here

+2

ご返信ありがとうございます。私は 'cairo_move_to'を使っていました、そうでなければ出力が見えませんでした。コードを短くするために 'cairo_move_to'をスキップしました。コードを更新しました。関数呼び出しの順序で間違いをしていますか? あなたのコードで 'transparency_value'を変更しようとしましたか? –

+0

私の編集を参照してください。結果を示す別の画像を 'transparency_value = 0.1'で追加しました。結果はまだ期待どおりに見え、私はあなたが見ている黒を再現することはできません。私は "間違っている"とは何ですか? –

+0

hmm!これはC++のバグですか?あるいは、フリータイプのライブラリでカイロを正しく構築できなかった可能性があります - 間違った出力が得られますか? –

関連する問題