2012-07-06 13 views
7

Sto utilizzando un gradiente radiale al Cairo, ma non sto ottenendo i risultati attesi. Il gradiente radiale che ottengo è molto meno sfocato di quanto mi aspetterei e non riesco a fingere di smettere di colorare per ottenere i risultati desiderati. Ecco il codice:Gradiente radiale 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); 

Ecco un'immagine di ciò di cui sto parlando.

radial gradient

+0

Come hai creato il 'quello che voglio' immagine? –

+0

Sono entrato in Pixelmator e ho usato un pennello con set di durezza dello 0%. – Q2Ftb3k

+0

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. –

risposta

5

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:

The image that the lua code produces

+0

Eccellente! Funziona perfettamente, grazie! – Q2Ftb3k