在golang中设置图像的不透明度 [英] Setting opacity of image in golang
问题描述
我有以下代码。它将前景图像(logo.jpg)粘贴到背景图像(background.jpg)上
粘贴此前景图像时,我想要设置此前景图像的不透明度。我使用DrawMask(http://golang.org/doc/articles/image_draw.html),但似乎我在这里失去了一些东西。请参阅下面的代码。任何人有任何想法?
包主
$ b导入(
os
image / draw
image
image / jpeg
)
func main(){
//背景图片
fImg1,_:= os.Open(background.jpg)
推迟fImg1.Close()
img1,_,_:= image.Decode(fImg1)
//标识贴在背景图片上
fImg2,_:= os.Open(logo.jpg)
推迟fImg2.Close()
img2,_,_: = image.Decode(fImg2)
//蒙版图像(这只是一个与徽标大小相同的纯色浅灰色图像)
fmask,_:= os.Open(mask。 jpg)
推迟fImg2.Close()
掩码,_,_:_:= image.Decode(fmask)
//创建一个新的空白图像m
m := image.NewRGBA(image.Rect(0,0,1920,1280))
//将背景图片粘贴到m
draw.Draw(m,m.Bounds(), img1,image.Point {0,0},draw.Src)
//现在使用掩码将徽标图像粘贴到m上(参考http://golang.org/doc/articles/image _draw.html)
// ******目标是当我们粘贴它时,将logo图片的不透明度值设置为50 ****
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-操纵在-golang)。感谢Sathish。
我在代码中看到两个错误。
-
您正在设置不正确的面具。要获得50%的不透明度,您需要像
mask:= image.NewUniform(color.Alpha {128})
其中128是0(透明)和255(不透明)。如果您想要256个以上的不透明度级别,请参阅color.Alpha16
。 当调用
draw.DrawMask()
,你很可能要使用 draw.Over
Op来代替 draw的.src
。 我也推荐 m:= image.NewRGBA(img1.Bounds())
,但手动操作并没有错。
I have following code. That does paste a foreground image (logo.jpg) over background image (background.jpg) While pasting this foreground image, I want to set the opacity of this foreground image. I used DrawMask (http://golang.org/doc/articles/image_draw.html), but it seems I am missing something here. Please see the code below. Anyone has any idea?
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})
}
Above code is helped by Sathish (http://stackoverflow.com/questions/12430874/image-manipulation-in-golang). Thanks Sathish.
I see two errors with your code.
You are setting the mask incorrectly. To get 50% opacity you want something like
mask := image.NewUniform(color.Alpha{128})
where 128 is half way between 0 (transparent), and 255 (opaque). If you want more than 256 levels of opacity, seecolor.Alpha16
.When calling
draw.DrawMask()
, you most likely want to use thedraw.Over
Op instead ofdraw.Src
. Try them both out and you should see the difference.
I also recommend m := image.NewRGBA(img1.Bounds())
, but it is not wrong to do it manually.
这篇关于在golang中设置图像的不透明度的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!