3

次のコードがあります。前景画像 (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) によって支援されています。ありがとうサティシュ。

4

2 に答える 2

5

コードに2つのエラーがあります。

  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())しますが、手動で行うのは間違いではありません。

于 2012-09-19T01:12:08.283 に答える
2

マスクを別の画像に基づいて作成したいので、おそらくグレースケールをアルファ マスクに変換する必要があります。以下のコードは、私が試したサンプルでうまく機能します。

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 画像をグレースケールに変換しているときに、画像パッケージがデコードできなかったいくつかのオプションで自動的に保存されていることに気付きました。そのため、各操作の後にエラー値を確認することをお勧めします。コードのサイズを小さくするために、ここではほとんど削除しました。
于 2012-09-19T10:07:28.467 に答える