2012-07-06 14 views
7

カイロでラジアルグラデーションを使用していますが、期待した結果が得られません。私が得ている放射状の勾配は、私が予想していたよりもはるかにあいまいではなく、希望の結果を得るために色の停止でうまくいかないようです。コードは次のとおりです。カイロ放射グラジエント

cairo_pattern_t *pat; 

pat = cairo_pattern_create_radial(100.0, 100.0, 0.0, 100.0, 100.0, 20.0); 
cairo_pattern_add_color_stop_rgba(pat, 0, 0, 0, 0, 1); 
cairo_pattern_add_color_stop_rgba(pat, 1, 0, 0, 0, 0); 

ここに私が話していることのイメージがあります。

radial gradient

+0

はどのように「私が望む何イメージを作成しましたか? –

+0

私はPixelmatorに入り、硬度0%のブラシを使いました。 – Q2Ftb3k

+0

カイロの結果は、線形補間を使用しています。中心から離れた各ピクセルは、2つのグレーの明度を獲得します。 「私が望むもの」の結果は線形ではありません。あなたが私に推測してもらいたいのであれば、Pixelmatorの結果はガンマ補正されます。 –

答えて

5

#cairoのIRCチャンネルはグラデーションを描画する(おかげで当社が!)cairo_maskを(使用する)の代わりにcairo_paintの()を提案しました。その結果、線形の進行の代わりに二乗されます。

私はluaで次のことを行いました。申し訳ありませんが、プロトタイプ作成は簡単です。 C APIに1と変換するために難しいことではありません:これは1をマップ私に

cairo = require("lgi").cairo 

s = cairo.ImageSurface(cairo.Format.ARGB32, 200, 100) 
c = cairo.Context(s) 
c:set_source_rgb(1, 1, 1) 
c:paint() 

p = cairo.Pattern.create_radial(50, 50, 0, 50, 50, 20) 
p:add_color_stop_rgba(0, 0, 0, 0, 1) 
p:add_color_stop_rgba(1, 0, 0, 0, 0) 

c:save() 
c:rectangle(0, 0, 100, 100) 
c:clip() 
c.source = p 
c:paint() 
c:restore() 

p = cairo.Pattern.create_radial(50, 50, 2, 50, 50, 25) 
p:add_color_stop_rgba(0, 0, 0, 0, 1) 
p:add_color_stop_rgba(1, 0, 0, 0, 0) 

c:translate(100, 0) 
c:save() 
c:rectangle(0, 0, 100, 100) 
c:clip() 
c.source = p 
c:mask(p) 
c:restore() 

s:write_to_png("test.png") 

、第二円(cairo_maskたものを()黒ソースとD ')もっとたくさん見えますあなたが欲しいもののように:

The image that the lua code produces

+0

優秀!これは完璧に動作します、ありがとう! – Q2Ftb3k

関連する問題