Создание эффекта подсветки с помощью библиотеки Каира - PullRequest
1 голос
/ 31 марта 2012

У меня есть cairo_t cr, который я могу использовать в Каире. Я хочу попытаться создать эффект выделения на этом каирском графике, который должен выполнить одно из следующих действий:

  • Осветлите все изображение, чтобы оно выглядело немного ярче
  • Измените фон, то есть прозрачные части изображения, на более яркий цвет (например, белый)
  • Возможно добавить небольшое размытие фона

Как я могу сделать это с Каиром?

[Редактировать] У меня есть виджет, который отображает значок, и я хочу выделить его, когда наведу курсор мыши на виджет. В дополнение к выделению я также хочу нарисовать белый фон, чтобы было яснее, какой значок выделен. [/ Edit]

1 Ответ

3 голосов
/ 31 марта 2012

Я думаю, вам следует проверить некоторые операторы, которыми обладает cairo:

http://cairographics.org/operators/

Осветление всего изображения должно быть осуществимо с помощью SOFT_LIGHT или LIGHTEN и яркого исходного цвета.Похоже.Я сделаю несколько экспериментов на этом.

Почему именно вы хотите изменить прозрачные части изображения?Я думаю, что большинство поверхностей не имеют прозрачных частей.В любом случае, я думаю, что DEST_OVER с белым источником должен сделать это.

Bluring - это то, что Каир не может сделать для вас.Тем не менее, вы можете нарисовать ваше изображение на поверхности изображения и использовать некоторый код, который плавает по Интернету, чтобы размыть это.Например, Google просто ведет меня следующим образом: http://taschenorakel.de/mathias/2008/11/24/blur-effect-cairo/

Редактировать: я провел несколько экспериментов (это привязки oocairo lua, http://oocairo.naquadah.org/). Я думаю, что вы хотите, чтобы оператор CAIRO_OPERATOR_ATOP с теломисточник, например, rgba (1, 1, 1, 0,25). Это, кажется, действительно осветляет изображение.


oocairo = require("oocairo")

s = oocairo.image_surface_create("argb32", 600, 400)
img = oocairo.image_surface_create_from_png("/usr/share/icons/wesnoth-1.8-icon.png")
local w, h = img:get_width(), img:get_height()

cr = oocairo.context_create(s)

function before()
    cr:save()
    cr:rectangle(0, 0, w, h)
    cr:clip()
    cr:set_source(img)
    cr:paint()
end
function after()
    cr:restore()
    cr:translate(w, 0)
end

function try_operator(op, alpha)
    before()
    cr:set_operator(op)
    cr:set_source_rgba(1, 1, 1, alpha)
    cr:paint()
    after()
end

function try_alpha(alpha)
    cr:save()
    before()
    after()
    try_operator("atop", alpha)
    try_operator("color-dodge", alpha)
    try_operator("soft-light", alpha)
    try_operator("hard-light", alpha)
    try_operator("hsl-hue", alpha)
    try_operator("hsl-saturation", alpha)
    try_operator("hsl-color", alpha)
    try_operator("hsl-luminosity", alpha)
    cr:restore()
    cr:translate(0, h)
end

try_alpha(1)
try_alpha(0.75)
try_alpha(0.5)
try_alpha(0.25)
try_alpha(0)

s:write_to_png("/tmp/t.png")
...