在golang中设置图像的不透明度 [英] Setting opacity of image in golang

查看:851
本文介绍了在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。

解决方案

我在代码中看到两个错误。


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


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.

  1. 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, see color.Alpha16.

  2. When calling draw.DrawMask(), you most likely want to use the draw.Over Op instead of draw.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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆