package utils import ( "encoding/base64" "gitee.ltd/lxh/logger/log" "github.com/skip2/go-qrcode" "image/color" ) 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 }