121 lines
2.9 KiB
Go
121 lines
2.9 KiB
Go
package controller
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/base64"
|
|
"errors"
|
|
"fmt"
|
|
"image"
|
|
"image/color"
|
|
"image/png"
|
|
|
|
"github.com/skip2/go-qrcode"
|
|
)
|
|
|
|
func GenerateQRCode(data string) (string, error) {
|
|
imgBytes, err := qrcode.Encode(data, qrcode.Medium, 256)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
base64Img := base64.StdEncoding.EncodeToString(imgBytes)
|
|
return base64Img, nil
|
|
}
|
|
|
|
// vvv DEPRECATED vvv
|
|
|
|
const margin = 4
|
|
|
|
type QRCodeECCLevel int64
|
|
const (
|
|
LOW QRCodeECCLevel = iota
|
|
MEDIUM
|
|
QUARTILE
|
|
HIGH
|
|
)
|
|
|
|
func noDepsGenerateQRCode() (string, error) {
|
|
version := 1
|
|
|
|
size := 0
|
|
size = 21 + version * 4
|
|
if version > 10 {
|
|
return "", errors.New(fmt.Sprintf("QR version %d not supported", version))
|
|
}
|
|
|
|
img := image.NewGray(image.Rect(0, 0, size + margin * 2, size + margin * 2))
|
|
|
|
// fill white
|
|
for y := range size + margin * 2 {
|
|
for x := range size + margin * 2 {
|
|
img.Set(x, y, color.White)
|
|
}
|
|
}
|
|
|
|
// draw alignment squares
|
|
drawLargeAlignmentSquare(margin, margin, img)
|
|
drawLargeAlignmentSquare(margin, margin + size - 7, img)
|
|
drawLargeAlignmentSquare(margin + size - 7, margin, img)
|
|
drawSmallAlignmentSquare(size - 5, size - 5, img)
|
|
/*
|
|
if version > 4 {
|
|
space := version * 3 - 2
|
|
end := size / space
|
|
for y := range size / space + 1 {
|
|
for x := range size / space + 1 {
|
|
if x == 0 && y == 0 { continue }
|
|
if x == 0 && y == end { continue }
|
|
if x == end && y == 0 { continue }
|
|
if x == end && y == end { continue }
|
|
drawSmallAlignmentSquare(
|
|
x * space + margin + 4,
|
|
y * space + margin + 4,
|
|
img,
|
|
)
|
|
}
|
|
}
|
|
}
|
|
*/
|
|
|
|
// draw timing bits
|
|
for i := margin + 6; i < size - 4; i++ {
|
|
if (i % 2 == 0) {
|
|
img.Set(i, margin + 6, color.Black)
|
|
img.Set(margin + 6, i, color.Black)
|
|
}
|
|
}
|
|
img.Set(margin + 8, size - 4, color.Black)
|
|
|
|
var imgBuf bytes.Buffer
|
|
err := png.Encode(&imgBuf, img)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
base64Img := base64.StdEncoding.EncodeToString(imgBuf.Bytes())
|
|
|
|
return "data:image/png;base64," + base64Img, nil
|
|
}
|
|
|
|
func drawLargeAlignmentSquare(x int, y int, img *image.Gray) {
|
|
for yi := range 7 {
|
|
for xi := range 7 {
|
|
if (xi == 0 || xi == 6) || (yi == 0 || yi == 6) {
|
|
img.Set(x + xi, y + yi, color.Black)
|
|
} else if (xi > 1 && xi < 5) && (yi > 1 && yi < 5) {
|
|
img.Set(x + xi, y + yi, color.Black)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
func drawSmallAlignmentSquare(x int, y int, img *image.Gray) {
|
|
for yi := range 5 {
|
|
for xi := range 5 {
|
|
if (xi == 0 || xi == 4) || (yi == 0 || yi == 4) {
|
|
img.Set(x + xi, y + yi, color.Black)
|
|
}
|
|
}
|
|
}
|
|
img.Set(x + 2, y + 2, color.Black)
|
|
}
|