2012-09-18 145 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