2012-07-06 5 views
7

Я использую радиальный градиент в Каире, но я не получаю ожидаемых результатов. Радиальный градиент, который я получаю, намного менее размыт, чем я ожидал, и я не могу поиграть с остановками цвета, чтобы получить желаемые результаты. Вот код: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); 

Вот изображение того, о чем я говорю.

radial gradient

+0

Как вы создаете «То, что я хочу» образ? –

+0

Я пошел в Pixelmator и использовал кисть, которая с 0% жесткостью установлена. – Q2Ftb3k

+0

Результат cairo использует интерполирование линейно. Каждый пиксель, расположенный дальше от центра, получает 2 оттенка серой зажигалки. «Я хочу» - результат не линейный. Если вы хотите, чтобы я догадался, результат Pixelmator гамма-коррекция, которая работает вокруг человеческого зрения. –

ответ

5

#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 с черным источником) выглядит намного больше как то, что вы хотите:

The image that the lua code produces

+0

Отлично! Это прекрасно работает, спасибо! – Q2Ftb3k

Смежные вопросы