如何实现边缘羽毛效应



我正在使用vips库来操纵某些图像,特别是其lua绑定,lua-vips,我正在尝试找到一种方法来对羽毛效应对图像。

这是我第一次尝试用于此类任务的库,我一直在研究可用的功能列表,但仍然不知道如何进行。它不是复杂的形状,只是一个基本的矩形图像,其顶部和底部的边缘应与背景平稳地融合(我当前正在使用vips_composite()on)。

假设存在" feather_edges"方法,它将是:

local bg = vips.Image.new_from_file("foo.png")
local img = vips.Image.new_from_file("bar.png") --smaller than `bg`
img = img:feather_edges(6) --imagine a 6px feather
bg:composite(img, 'over')

,但最好指定应该羽毛的图像部分。关于如何做的任何想法?

您需要将alpha从顶部图像中拉出,用黑色边框掩盖边缘,模糊alpha以羽毛,然后reattach,然后构成。

类似:

#!/usr/bin/luajit
vips = require 'vips'
function feather_edges(image, sigma)
    -- split to alpha + image data 
    local alpha = image:extract_band(image:bands() - 1)
    local image = image:extract_band(0, {n = image:bands() - 1})
    -- we need to place a black border on the alpha we can then feather into,
    -- and scale this border with sigma
    local margin = sigma * 2
    alpha = alpha
        :crop(margin, margin,
            image:width() - 2 * margin, image:height() - 2 * margin)
        :embed(margin, margin, image:width(), image:height())
        :gaussblur(sigma)
    -- and reattach
    return image:bandjoin(alpha)
end
bg = vips.Image.new_from_file(arg[1], {access = "sequential"})
fg = vips.Image.new_from_file(arg[2], {access = "sequential"})
fg = feather_edges(fg, 10)
out = bg:composite(fg, "over", {x = 100, y = 100})
out:write_to_file(arg[3])

正如jcupitt所说,我们需要从图像中拉动alpha频段,模糊它,再次加入并与背景复合,但是使用函数,使其保持薄薄前景图像周围的黑色边框。

要克服这一点,我们需要复制图像,根据sigma参数进行调整大小,请从还原副本中提取alpha频段,模糊,然后用它替换原始图像的alpha频段。这样,原始图像的边界将被alpha的透明部分完全覆盖。

local function featherEdges(img, sigma)
    local copy = img:copy()
        :resize(1, { vscale = (img:height() - sigma * 2) / img:height() })
        :embed(0, sigma, img:width(), img:height())
    local alpha = copy
        :extract_band(copy:bands() - 1)
        :gaussblur(sigma)
    return img
        :extract_band(0, { n = img:bands() - 1 })
        :bandjoin(alpha)
end

相关内容

  • 没有找到相关文章

最新更新