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() }