Golang 通過Image包實現圖片處理、二維碼生成
阿新 • • 發佈:2022-03-13
首先準備一個簡單的圖片 qrcode.png
瞭解下幾個處理圖片的方法
image.Decode() // 得到檔案的圖片物件 image.NewRGBA() // 建立一個真彩色的影象物件 *RGBA func (p *RGBA) Bounds() Rectangle { return p.Rect } // 獲取圖片的尺寸 func (p *RGBA) Set(x, y int, c color.Color) {} // 以畫素點為單位為影象上色 func Draw(dst Image, r image.Rectangle, src image.Image, sp image.Point, op Op) {} // 圖片拼接 func Encode(w io.Writer, m image.Image) error {} // 輸出圖片檔案
案例一、將上面的圖片繪製在以黑色為底的圖片上:
func TestImageSplice(t *testing.T) { // 建立一個以黑色為底的圖片 bgImg := image.NewRGBA(image.Rect(0, 0, 300, 300)) for x := 0; x < bgImg.Bounds().Dx(); x++ { // 將背景圖塗黑 for y := 0; y < bgImg.Bounds().Dy(); y++ { bgImg.Set(x, y, color.Black) } } // 拿到二維碼圖片物件 f, err := os.Open("./qrcode.png") if err != nil { panic(err) } qrcodeImg, _, err := image.Decode(f) // 將二維碼圖片繪製到黑色的圖片上 draw.Draw(bgImg, bgImg.Bounds(), qrcodeImg, image.Pt(0, 0), draw.Over) fileOut, _ := os.Create("./image.png") png.Encode(fileOut, bgImg) }
案例二、自定義二維碼中心的logo
需要匯入resize
包:
go get github.com/nfnt/resize
程式碼:
func TestQrcodeLogoSlice(t *testing.T) { qrcodeFile, err := os.Open("./qrcode.png") if err != nil { panic(err) } qrcodeImg, _, err := image.Decode(qrcodeFile) logoFile, err := os.Open("./logo.png") if err != nil { panic(err) } logoImg, _, err := image.Decode(logoFile) logoImg = resize.Resize(uint(20), uint(20), logoImg, resize.Lanczos3) outQrcodeImg := image.NewRGBA(qrcodeImg.Bounds()) draw.Draw(outQrcodeImg, qrcodeImg.Bounds(), qrcodeImg, image.Pt(0,0), draw.Over) offset := image.Pt((outQrcodeImg.Bounds().Max.X-logoImg.Bounds().Max.X)/2, (outQrcodeImg.Bounds().Max.Y-logoImg.Bounds().Max.Y)/2) draw.Draw(outQrcodeImg, qrcodeImg.Bounds().Add(offset), logoImg, image.Pt(0,0), draw.Over) fileOut, _ := os.Create("./image.png") png.Encode(fileOut, outQrcodeImg) }
案例三、使用字串生成二維碼後,將其拼接上logo
// 帶logo的二維碼圖片生成
func TestQrcodeWithLogoGenerate(t *testing.T) {
content := "https://baidu.com"
code, err := qrcode.New(content, qrcode.Medium)
if err != nil {
return
}
qrcodeImg := code.Image(256)
outImg := image.NewRGBA(qrcodeImg.Bounds())
logoFile, err := os.Open("./logo.png")
if err != nil {
panic(err)
}
logoImg, _, err := image.Decode(logoFile)
logoImg = resize.Resize(uint(20), uint(20), logoImg, resize.Lanczos3)
draw.Draw(outImg, outImg.Bounds(), qrcodeImg, image.Pt(0, 0), draw.Over)
offset := image.Pt((outImg.Bounds().Max.X-logoImg.Bounds().Max.X)/2, (outImg.Bounds().Max.Y-logoImg.Bounds().Max.Y)/2)
draw.Draw(outImg, outImg.Bounds().Add(offset), logoImg, image.Pt(0, 0), draw.Over)
f, err := os.Create("image.png")
if err != nil {
return
}
png.Encode(f, outImg)
}
輸出圖片與案例二一樣。