的#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