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