go語言對圖片的操作相當方便。無論是生成一張新圖片,還是在現(xiàn)有的圖片上做一些操作。這次,來試試非常流行的圖片上加自己的logo水印。當然,二維碼是比較特殊的一個例子,它不能超過背景圖片的一定比例面積,不然可能會影響二維碼的識別。
首先要準備好疊加的兩個圖片文件,這里我要疊加的文件是 1.png 和 2.png
file1 := "1.png"
file2 := "2.png"
img1, err1 := os.Open(file1)
img2, err2 := os.Open(file2)
if err1 != nil {
log.Println("圖片文件打開錯誤", err1.Error())
}
if err2 != nil {
log.Println("圖片文件打開錯誤", err2.Error())
}
mapImg, _, err3 := image.Decode(img1)
icoImg, _, err4 := image.Decode(img2)
if err3 != nil {
log.Println("", err3.Error())
panic(err3)
}
if err4 != nil {
log.Println("", err4.Error())
panic(err4)
}
然后,準備好畫布邊界和水印相對位置。水印的相對位置,是針對背景左上角的位置來說的。
//--畫布背景邊界
canvas := image.NewRGBA(mapImg.Bounds())
fmt.Println(mapImg.Bounds().Size())
fmt.Println(icoImg.Bounds().Size())
//--水印logo相對背景左上角的位置
icoImgPnt := image.Point{(mapImg.Bounds().Size().X-icoImg.Bounds().Size().X)/-2,(mapImg.Bounds().Size().Y-icoImg.Bounds().Size().Y)/-2}
下面是最關(guān)鍵的兩句代碼來了。第一句是畫出背景,第二句是畫出水印logo的。
draw.Draw(canvas, canvas.Bounds(), mapImg, image.Point{0,0}, draw.Src)
draw.DrawMask(canvas, canvas.Bounds(), image.Image(icoImg), icoImgPnt, mapImg, image.Point{0,0}, draw.Src)
這里已經(jīng)把需要的內(nèi)容畫出來了,還需要再加上最后一步,把內(nèi)容生成圖片。
myfile, err := os.Create("new.png") // now let's save image
if err != nil {
panic(err)
}
png.Encode(myfile, canvas)
生成的效果如下圖片如下

image.png
由于上傳文件的限制,生成效果使用的大圖片不是二維碼的,但是不影響技術(shù)實現(xiàn)方法的體驗。