2012-07-06 28 views
7

Tôi đang sử dụng một gradient xuyên tâm ở Cairo, nhưng tôi không nhận được kết quả mong đợi. Các gradient xuyên tâm tôi nhận được là ít mờ hơn tôi mong đợi và tôi không thể dường như fiddle với các điểm dừng màu để có được kết quả mong muốn. Đây là mã:Cairo Radial Gradient

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

Đây là hình ảnh về những gì tôi đang nói đến.

radial gradient

+0

Bạn đã tạo hình ảnh 'Tôi muốn' như thế nào? –

+0

Tôi đã đi vào Pixelmator và sử dụng một bàn chải với bộ độ cứng 0%. – Q2Ftb3k

+0

Kết quả cairo đang sử dụng nội suy tuyến tính. Mỗi pixel cách xa trung tâm được 2 màu xám nhạt hơn. Kết quả 'Điều tôi muốn' không phải là tuyến tính. Nếu bạn muốn tôi đoán, kết quả Pixelmator là gamma được sửa chữa, hoạt động xung quanh tầm nhìn của con người. –

Trả lời

5

Kênh #cairo IRC gợi ý (Cảm ơn Công ty!) Để sử dụng cairo_mask() thay vì cairo_paint() để vẽ gradient. Điều đó dẫn đến một bình phương thay vì tiến triển tuyến tính.

Tôi đã làm như sau trong lua. Xin lỗi cho ngôn ngữ, nhưng nó dễ dàng hơn để thử nghiệm một cái gì đó. Đây bản đồ 1: 1 đến C API và không nên khó có thể dịch:

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

Đối với tôi, vòng tròn thứ hai (Một trong đó là cairo_mask() 'd với một nguồn đen) trông rất nhiều giống như những gì bạn muốn:

The image that the lua code produces

+0

Tuyệt vời! Điều này hoạt động hoàn hảo, cảm ơn! – Q2Ftb3k