76 lines
1.9 KiB
Go
76 lines
1.9 KiB
Go
package utils
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/base64"
|
|
"fmt"
|
|
"github.com/nfnt/resize"
|
|
"github.com/skip2/go-qrcode"
|
|
"image"
|
|
"image/draw"
|
|
"image/jpeg"
|
|
"image/png"
|
|
"net/http"
|
|
)
|
|
|
|
func CreateQr(content string, logoUrl string, level qrcode.RecoveryLevel, size int) (qr string, err error) {
|
|
emptyBuff, err := CreateQrBase(content, logoUrl, level, size)
|
|
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
return string(emptyBuff.Bytes()), nil
|
|
//return "data:image/png;base64," + base64.StdEncoding.EncodeToString(emptyBuff.Bytes()), nil
|
|
}
|
|
|
|
func CreateQrBase64(content string, logoUrl string) (qr string, err error) {
|
|
|
|
emptyBuff, err := CreateQrBase(content, logoUrl, qrcode.Low, 120)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
//return string(emptyBuff.Bytes()), nil
|
|
return "data:image/png;base64," + base64.StdEncoding.EncodeToString(emptyBuff.Bytes()), nil
|
|
}
|
|
|
|
func CreateQrBase(content string, logoUrl string, level qrcode.RecoveryLevel, size int) (emptyBuff *bytes.Buffer, err error) {
|
|
emptyBuff = bytes.NewBuffer(nil) //开辟一个新的空buff
|
|
|
|
qrC, err := qrcode.New(content, level)
|
|
img := qrC.Image(size)
|
|
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
total := image.NewRGBA(img.Bounds()) //设置背景
|
|
draw.Draw(total, total.Bounds(), img, img.Bounds().Min, draw.Over)
|
|
|
|
if logoUrl != "" { //是否有logo
|
|
v, err := http.Get(logoUrl)
|
|
if err != nil {
|
|
fmt.Printf("Http get [%v] failed! %v", logoUrl, err)
|
|
return emptyBuff, err
|
|
}
|
|
defer v.Body.Close()
|
|
|
|
icoImg2, err := png.Decode(v.Body)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
icoImg := resize.Resize(54, 52, icoImg2, resize.Lanczos3)
|
|
|
|
icoImgPnt := image.Point{X: (total.Bounds().Size().X - icoImg.Bounds().Size().X) / -2, Y: (total.Bounds().Size().Y - icoImg.Bounds().Size().Y) / -2}
|
|
draw.DrawMask(total, total.Bounds(), icoImg, icoImgPnt, nil, image.Point{}, draw.Src)
|
|
}
|
|
|
|
err = jpeg.Encode(emptyBuff, total, nil)
|
|
if err != nil {
|
|
return emptyBuff, err
|
|
}
|
|
return emptyBuff, nil
|
|
}
|