的#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)看上去多了很多就像你想要什么:
你是如何创建的“我想要什么”的形象? – 2012-07-06 17:15:53
我进入Pixelmator并使用硬度设定为0%的笔刷。 – Q2Ftb3k 2012-07-06 17:37:10
开罗结果是使用线性插值。距离中心较远的每个像素都会得到2灰度较浅的阴影。 '我想要的'结果不是线性的。如果你想让我猜测,Pixelmator的结果是经过伽马校正的,它是围绕着人类视觉的。 – 2012-07-06 21:23:45