2012-09-18 4 views
2

다음 코드가 있습니다. 그러면 배경 이미지 (background.jpg) 위에 전경 이미지 (logo.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}) 
} 

은 사티시로 (http://stackoverflow.com/questions/12430874/image-manipulation-in-golang) 도움이됩니다. Sathish에게 감사드립니다.

답변

3

코드에 2 개의 오류가 있습니다.

  1. 마스크를 잘못 설정하고 있습니다. 50 % 불투명도를 얻으려면 mask := image.NewUniform(color.Alpha{128})과 같은 것을 사용하십시오. 여기서 128은 0 (투명)과 255 (불투명) 사이의 중간 값입니다. 256 단계 이상의 불투명도가 필요하면 color.Alpha16을 참조하십시오.

  2. draw.DrawMask()으로 전화 할 때는 draw.Src 대신에 draw.Over Op를 사용하고 싶을 것입니다. 둘 다 시도해보십시오. 차이점을 확인해야합니다.

나는 또한 m := image.NewRGBA(img1.Bounds())을 권장하지만, 수동으로하는 것이 좋습니다.

+0

굉장한 스티브. 그것은 일했습니다 :) 정말 고마워요. 한가지 더 질문이 있습니다. 시간이 있다면 http://stackoverflow.com/questions/12487561/golang-json-unmarshal-is-not-returning-data-correctly – JVK

1

다른 이미지의 마스크를 사용하지 않으려는 경우 그레이 스케일을 알파 마스크로 변환해야 할 수 있습니다. 아래 코드는 내가 시도한 샘플에서 잘 작동한다.

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 이미지를 변환하는 동안, 나는 그것이 자동으로 이미지 패키지가 디코딩 할 수있는 몇 가지 옵션이 저장되는 것으로 나타났습니다. 따라서 각 작업 후에 오류 값을 확인해야 할 수 있습니다. 코드 크기를 줄이기 위해 여기에서 대부분 제거했습니다.
+0

감사합니다. Sathish. 그것은 작동합니다. – JVK