vision/barcode.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()
}