Il canale IRC#cairo suggerito (Grazie impresa!) Per utilizzare cairo_mask() al posto di cairo_paint() per disegnare il gradiente. Ciò si traduce in un quadrato al posto della progressione lineare.
Ho fatto quanto segue in lua. Ci scusiamo per il linguaggio, ma è più semplice prototipare qualcosa. Questa mappa 1: 1 per l'API C e non dovrebbe essere difficile da tradurre:
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")
Per me, il secondo cerchio (quello che è stato cairo_mask() 'd con una fonte di nero) sembra molto più come quello che si vuole:
Come hai creato il 'quello che voglio' immagine? –
Sono entrato in Pixelmator e ho usato un pennello con set di durezza dello 0%. – Q2Ftb3k
Il risultato di cairo utilizza l'interpolazione linearmente. Ogni pixel più lontano dal centro riceve 2 tonalità di grigio più chiaro. Il risultato "Quello che voglio" non è lineare. Se vuoi che indovini, il risultato di Pixelmator è la correzione gamma, che funziona attorno alla visione umana. –