【问题标题】:Drop Shadow with Golang based on alpha基于 alpha 的 Golang 投影
【发布时间】:2021-04-26 07:28:12
【问题描述】:

我需要从具有 Alpha 通道的 image.Image 类型的对象中投射阴影。目标不是让矩形阴影,而是 alpha。

我想做的是:

  • 取出 Alpha 通道
  • 将其转换为黑色 RGB 图像
  • 扩展到 N 个像素(N=模糊的大小)
  • 应用高斯模糊
  • 将其应用为背景

最后一点非常简单,这要归功于“image/draw”API(例如,我可以将图像切割成圆形并应用蒙版)。

输出 alpha 通道似乎也很简单(对于每个像素,在 R、G 和 B 上应用 255*alpha 乘法,或者使用灰度图像,最后将白色反转为黑色)

这显然是我有问题的膨胀和模糊。

我不反对这个操作的图像改变大小(最坏的情况下我会在转换之前缩小原始图像)

问题是“如何在image.Image 上使用 Go 扩大和模糊 alpha 通道”?

【问题讨论】:

  • 我认为这可能有助于减少/重新关注您需要解决的具体问题。目前,您的大部分问题都在解释您不需要需要帮助的细节,而您确实需要帮助的部分还不是很清楚(至少对我来说)。例如,我不确定您所说的“扩展到 N 个像素”和“膨胀”具体是什么意思。
  • @HymnsForDisco N 是阴影的大小,因为 alpha 通道会粘在遮罩上,所以我猜需要扩大 alpha。我编辑了我的问题。唯一需要的是使用image.Image 有一个轨道来扩大和模糊一个 alpha 通道

标签: image go shadow


【解决方案1】:

好的,经过一段时间,我终于做到了。

我重建 alpha 并将其除以 2(这将是一个参数)。

我正在使用 github.com/disintegration/imaging 包来模糊 alpha。

func DropShadow(img image.Image, size float64) image.Image {
    bounds := img.Bounds()
    sizeInt := int(math.Ceil(size)) * 4
    final := imaging.New(bounds.Dx()+sizeInt, bounds.Dy()+sizeInt, color.Alpha{})

    for x := 0; x < bounds.Dx(); x++ {
        for y := 0; y < bounds.Dy(); y++ {
            _, _, _, a := img.At(x, y).RGBA()
            final.Set(x+sizeInt/2, y+sizeInt/2, color.RGBA{0x0, 0x0, 0x0, uint8(a / 2)})
        }
    }
    final = imaging.Blur(final, size)
    final = imaging.Overlay(final, img, image.Point{sizeInt / 2, sizeInt / 2}, 1)

    return final
}

我需要将图像缩放 4 以使阴影不会粘在边框上,这有点奇怪。但它确实完成了工作......

【讨论】:

    猜你喜欢
    • 2021-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-30
    相关资源
    最近更新 更多