77 lines
1.7 KiB
Go
77 lines
1.7 KiB
Go
package vision
|
|
|
|
import (
|
|
"github.com/makiuchi-d/gozxing"
|
|
"github.com/makiuchi-d/gozxing/qrcode"
|
|
"github.com/makiuchi-d/gozxing/oned"
|
|
boombuler "github.com/boombuler/barcode"
|
|
"github.com/boombuler/barcode/code128"
|
|
"github.com/fogleman/gg"
|
|
)
|
|
|
|
// GenerateBarcode 生成一个条形码画布 (Code128)
|
|
func GenerateBarcode(content string, width, height int) (*Canvas, error) {
|
|
b, err := code128.Encode(content)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// 缩放到指定尺寸
|
|
scaled, err := boombuler.Scale(b, width, height)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &Canvas{
|
|
dc: gg.NewContextForImage(scaled),
|
|
}, nil
|
|
}
|
|
|
|
// DecodeQRCode 识别图片中的二维码
|
|
func (c *Canvas) DecodeQRCode() (string, error) {
|
|
bmp, err := gozxing.NewBinaryBitmapFromImage(c.dc.Image())
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
qrReader := qrcode.NewQRCodeReader()
|
|
result, err := qrReader.Decode(bmp, nil)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
return result.GetText(), nil
|
|
}
|
|
|
|
// DecodeBarcode 识别图片中的条形码
|
|
func (c *Canvas) DecodeBarcode() (string, error) {
|
|
bmp, err := gozxing.NewBinaryBitmapFromImage(c.dc.Image())
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
// 尝试 Code128
|
|
reader := oned.NewCode128Reader()
|
|
result, err := reader.Decode(bmp, nil)
|
|
if err != nil {
|
|
// 尝试 UPC/EAN
|
|
upcReader := oned.NewMultiFormatUPCEANReader(nil)
|
|
result, err = upcReader.Decode(bmp, nil)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
}
|
|
|
|
return result.GetText(), nil
|
|
}
|
|
|
|
// DecodeAll 自动尝试识别图片中的任何码 (QR, Barcode)
|
|
func (c *Canvas) DecodeAll() (string, error) {
|
|
// 先尝试 QR
|
|
if res, err := c.DecodeQRCode(); err == nil {
|
|
return res, nil
|
|
}
|
|
// 再尝试条形码
|
|
return c.DecodeBarcode()
|
|
}
|