82 lines
1.8 KiB
Go
Raw Normal View History

2024-07-05 14:41:35 +08:00
package utils
import (
"encoding/base64"
"gitee.ltd/lxh/logger/log"
"github.com/skip2/go-qrcode"
"image/color"
2024-07-05 14:41:35 +08:00
)
type qrCode struct{}
func QRCode() qrCode {
return qrCode{}
}
// GenerateQrCodeBase64
// @description: 生成二维码
// @receiver qr
// @param content
// @param size
// @return imgStr
// @return err
func (qr qrCode) GenerateQrCodeBase64(content []byte, size int) (imgStr string, err error) {
q, err := qrcode.New(string(content), qrcode.Highest)
if err != nil {
log.Errorf("初始化二维码对象失败: %v", err.Error())
return
}
q.DisableBorder = false
png, err := q.PNG(size)
if err != nil {
log.Errorf("生成二维码失败: %v", err.Error())
return "", err
}
imgStr = "data:image/png;base64," + base64.StdEncoding.EncodeToString(png)
return
}
// GenerateQrCodeASCII
// @description: 生成二维码
// @receiver qr
// @param content
// @param size
// @return imgStr
// @return err
func (qr qrCode) GenerateQrCodeASCII(content []byte) (str string, err error) {
q, err := qrcode.New(string(content), qrcode.Highest)
if err != nil {
log.Errorf("初始化二维码对象失败: %v", err.Error())
return
}
// 设置二维码的尺寸,这里是 16 的倍数
size := 16
img := q.Image(size)
isBlock := func(c color.Color) bool {
r, g, b, _ := c.RGBA()
// 转换到 0-255 范围,并判断是否接近黑色
return r < 5000 && g < 5000 && b < 5000
}
for y := 0; y < img.Bounds().Dy(); y += 16 {
for x := 0; x < img.Bounds().Dx(); x++ {
// 获取当前像素的颜色
color := img.At(x, y)
// 判断像素是否接近黑色,黑色输出为 '██',白色输出为空格
if isBlock(color) {
str += "██" // 黑色模块,输出方块字符
} else {
str += " " // 白色模块,输出空格
}
}
str += "\n"
}
return str, nil
}