1

私はcairo_t crカイロで描くことができる を持っています。次のいずれかを実行する必要がある、このカイロ グラフィックにハイライト効果を作成したいと考えています。

  • 画像全体を明るくして、少し明るく見えるようにします
  • 背景、つまり画像の透明な部分を明るい色 (白など) に変更します。
  • 背景に少しぼかしを加えるかもしれません

どうすればカイロでそれを行うことができますか?

[編集] アイコンを表示するウィジェットがあり、マウスをウィジェットの上に移動したときにそれを強調表示したいと考えています。ハイライトに加えて、どのアイコンがハイライトされているかがより明確になるように、白い背景を描画したいと考えています。[/編集]

4

1 に答える 1

3

cairo が持っているいくつかの演算子を確認する必要があると思います。

http://cairographics.org/operators/

画像全体を明るくするには、SOFT_LIGHT または LIGHTEN と明るいソース カラーを使用します。私は推測する。私はそれについていくつかの実験を行います。

画像の透明部分を変更したいのはなぜですか?ほとんどのサーフェスには透明な部分がないと思います。とにかく、白いソースの DEST_OVER がそうすべきだと思います。

ぼかしはカイロではできないことです。ただし、イメージをイメージ サーフェスに描画し、それをぼかすためにインターネット上に浮かんでいるコードの一部を使用することができます。たとえば、Google は次のように案内してくれます: http://taschenorakel.de/mathias/2008/11/24/blur-effect-cairo/

編集: 私はいくつかの実験を行いました (これは oocairo lua バインディング、http://oocairo.naquadah.org/ です)。rgba(1, 1, 1, 0.25) などの確実なソースを持つ演算子 CAIRO_OPERATOR_ATOP が必要だと思います。これは実際にイメージを明るくするようです。


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")
于 2012-03-31T18:35:02.550 に答える