开罗径向渐变

8

我正在使用Cairo中的径向渐变,但是我没有得到期望的结果。我得到的径向渐变比我预期的要模糊得多,并且我似乎无法通过调整颜色停止位置来获得所需的结果。以下是代码:

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);

这是我所说的内容的图示。 径向渐变

你是如何创建“我想要的”图片的? - Uli Schlachter
我进入Pixelmator并使用了硬度设置为0%的画笔。 - Q2Ftb3k
cairo 的结果是使用线性插值。离中心越远的每个像素会变得更亮,灰度值增加 2。而“我想要”的结果不是线性的。如果你让我猜的话,Pixelmator 的结果经过了伽马校正,这可以绕过人类视觉的限制。 - Uli Schlachter
除了以编程方式非线性地放置色标之外,还有其他可能的解决方案吗? - Q2Ftb3k
1个回答

6

#cairo IRC频道建议(感谢Company!)使用cairo_mask()而不是cairo_paint()来绘制渐变。这将导致方形而不是线性的进展。

我在lua中执行了以下操作。抱歉使用这种语言,但原型设计更容易。这与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()处理的那个)更像你想要的样子: lua代码生成的图像

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接