2012-07-06 72 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

你是如何創建的「我想要什麼」的形象? – 2012-07-06 17:15:53

+0

我進入Pixelmator並使用硬度設定爲0%的筆刷。 – Q2Ftb3k 2012-07-06 17:37:10

+0

開羅結果是使用線性插值。距離中心較遠的每個像素都會得到2灰度較淺的陰影。 '我想要的'結果不是線性的。如果你想讓我猜測,Pixelmator的結果是經過伽馬校正的,它是圍繞着人類視覺的。 – 2012-07-06 21:23:45

回答

5

的#cairo IRC通道建議(感謝公司!)使用cairo_mask()代替cairo_paint()繪製漸變。這會導致平方而不是線性進展。

我在lua做了以下工作。對不起,對於語言來說,但是對原型進行原型更容易。這將映射1:1至C API,不應該是很難翻譯:

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 2012-07-08 00:02:10