2012-09-18 146 views
2

我有以下代码。它将前景图像(logo.jpg)粘贴到背景图像(background.jpg)上 粘贴此前景图像时,我想要设置此前景图像的不透明度。我使用DrawMask(http://golang.org/doc/articles/image_draw.html),但似乎我在这里失去了一些东西。请参阅下面的代码。任何人有任何想法?在golang中设置图像的不透明度

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)。谢谢Sathish。

回答

3

我看到你的代码有两个错误。

  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()),但手动操作并没有错。

+0

真棒史蒂夫。它的工作:)非常感谢你。还有一个问题,如果你有时间,我张贴在http://stackoverflow.com/questions/12487561/golang-json-unmarshal-is-not-returning-data-correctly – JVK

1

由于您想将遮罩基于其他图像,因此可能必须将灰度转换为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()) 
    } 
} 
  • 额外注:当转换为JPEG图像在GIMP灰度,我注意到,它会自动与图像包不能解码的一些选项保存。所以你可能想在每个操作之后检查错误值。为了减少代码的大小,我主要在这里删除它。
+0

谢谢你Sathish。有用。 – JVK