【问题标题】:Setting opacity of image in golang在golang中设置图像的不透明度
【发布时间】:2012-09-18 20:23:35
【问题描述】:

我有以下代码。这确实将前景图像(logo.jpg)粘贴到背景图像(background.jpg)上 在粘贴此前景图像时,我想设置此前景图像的不透明度。我使用了 DrawMask (http://golang.org/doc/articles/image_draw.html),但似乎我在这里遗漏了一些东西。请看下面的代码。有人知道吗?

package main

    import (
    "os"
    "image/draw"
    "image"
    "image/jpeg"
)

func main() {
//Background image
    fImg1, _ := os.Open("background.jpg")
    defer fImg1.Close()
    img1, _, _ := image.Decode(fImg1)

//Logo to stick over background image
    fImg2, _ := os.Open("logo.jpg")
    defer fImg2.Close()
    img2, _, _ := image.Decode(fImg2)

//Mask image (that is just a solid light gray image of same size as logo)
    fmask, _ := os.Open("mask.jpg")
    defer fImg2.Close()
    mask, _, _ := image.Decode(fmask)

//Create a new blank image m
    m := image.NewRGBA(image.Rect(0, 0, 1920, 1280))

//Paste background image over m
    draw.Draw(m, m.Bounds(), img1, image.Point{0,0}, draw.Src)

//Now paste logo image over m using a mask (ref. http://golang.org/doc/articles/image_draw.html )

//******Goal is to have opacity value 50 of logo image, when we paste it****
    draw.DrawMask(m, m.Bounds(), img2, image.Point{-100,-100}, mask, image.Point{-100,-100}, draw.Src)

     toimg, _ := os.Create("new.jpg")
     defer toimg.Close()

     jpeg.Encode(toimg, m, &jpeg.Options{jpeg.DefaultQuality})
}

上述代码由 Sathish (http://stackoverflow.com/questions/12430874/image-manipulation-in-golang) 提供帮助。谢谢萨西什。

【问题讨论】:

    标签: google-app-engine go


    【解决方案1】:

    我发现您的代码有两个错误。

    1. 您设置的掩码不正确。要获得 50% 的不透明度,您需要像 mask := image.NewUniform(color.Alpha{128}) 这样的东西,其中 128 介于 0(透明)和 255(不透明)之间。如果您想要超过 256 级的不透明度,请参阅color.Alpha16

    2. 调用draw.DrawMask() 时,您很可能希望使用draw.Over Op 而不是draw.Src。试试它们,你应该会发现它们的不同。

    我也推荐m := image.NewRGBA(img1.Bounds()),不过手动做也没有错。

    【讨论】:

    【解决方案2】:

    由于您希望蒙版基于另一张图像,您可能必须将灰度转换为 Alpha 蒙版。下面的代码在我尝试过的示例上运行良好。

    package main
    
    import (
        "fmt"
        "image"
        "image/color"
        "image/draw"
        "image/jpeg"
        "os"
    )
    
    func main() {
    
        fBg, err := os.Open("bkground.jpg")
        defer fBg.Close()
        bg, _, err := image.Decode(fBg)
    
        fSrc, err := os.Open("arrow1.jpg")
        defer fSrc.Close()
        src, _, err := image.Decode(fSrc)
    
        fMaskImg, err := os.Open("mask.jpg")
        defer fMaskImg.Close()
        maskImg, _, err := image.Decode(fMaskImg)
    
        bounds := src.Bounds() //you have defined that both src and mask are same size, and maskImg is a grayscale of the src image. So we'll use that common size.
        mask := image.NewAlpha(bounds)
        for x := 0; x < bounds.Dx(); x++ {
            for y := 0; y < bounds.Dy(); y++ {
                //get one of r, g, b on the mask image ...
                r, _, _, _ := maskImg.At(x, y).RGBA()
                //... and set it as the alpha value on the mask.  
                mask.SetAlpha(x, y, color.Alpha{uint8(255 - r)}) //Assuming that white is your transparency, subtract it from 255
            }
        }
    
        m := image.NewRGBA(bounds)
        draw.Draw(m, m.Bounds(), bg, image.ZP, draw.Src)
    
        draw.DrawMask(m, bounds, src, image.ZP, mask, image.ZP, draw.Over)
    
        toimg, _ := os.Create("new.jpeg")
        defer toimg.Close()
    
        err = jpeg.Encode(toimg, m, nil)
        if err != nil {
            fmt.Println("Error: " + err.Error())
        }
    }
    
    • 额外说明:在 gimp 中将 jpeg 图像转换为灰度时,我注意到它会自动保存一些图像包无法解码的选项。因此,您可能希望在每次操作后检查错误值。为了减少代码大小,我在这里大部分都将其删除。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-05
      • 2010-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多