在物流、零售、仓储等行业,条形码 是最常见的商品标识方式。常见的格式有 EAN-13、UPC-A、Code128 等。我们可以用 Go 实现一个条形码识别工具,能够从图片中识别出条码并解析内容。
下面我带你从原理到代码,完整实现一个命令行条形码识别器。
功能目标
- 输入图片文件,自动识别条形码内容。
- 支持常见条码格式:EAN-13、UPC、Code128、QR Code 等。
- 命令行运行,支持批量识别。
- 输出识别到的码值及格式。
技术选型
Go 生态里条码识别库不多,我们可以利用成熟的 ZBar 库:
- makiuchi-d/gozxing:Go 语言实现 ZXing(二维码/条形码识别库)。
- github.com/makiuchi-d/... 支持 QRCode。
- ZBar C 库 的 Go binding(需安装系统库)。
为了避免跨平台问题,这里选 纯 Go 实现的 gozxing
,可以直接识别条形码/二维码。
项目结构
go
barcode-reader/
├── main.go
├── go.mod
完整代码(main.go)
go
package main
import (
"flag"
"fmt"
"image"
_ "image/jpeg"
_ "image/png"
"os"
"github.com/makiuchi-d/gozxing"
"github.com/makiuchi-d/gozxing/multi"
)
func main() {
input := flag.String("in", "barcode.png", "输入图片文件")
flag.Parse()
file, err := os.Open(*input)
if err != nil {
fmt.Printf("❌ 打开图片失败: %v\n", err)
os.Exit(1)
}
defer file.Close()
img, _, err := image.Decode(file)
if err != nil {
fmt.Printf("❌ 解码图片失败: %v\n", err)
os.Exit(1)
}
// 将 image 转换为 BinaryBitmap
source := gozxing.NewLuminanceSourceFromImage(img)
bmp, _ := gozxing.NewBinaryBitmap(gozxing.NewGlobalHistgramBinarizer(source))
// 使用 MultiFormatReader 识别多种码制
reader := multi.NewByQuadrantReader(gozxing.NewMultiFormatReader())
result, err := reader.Decode(bmp, nil)
if err != nil {
fmt.Printf("❌ 未识别到条码: %v\n", err)
os.Exit(1)
}
fmt.Println("✅ 识别成功!")
fmt.Printf("内容: %s\n", result.String())
fmt.Printf("格式: %s\n", result.GetBarcodeFormat())
}
使用方法
- 初始化项目并安装依赖:
bash
go mod init barcode-reader
go get github.com/makiuchi-d/gozxing
- 编译:
bash
go build -o barcode-reader main.go
- 执行:
bash
./barcode-reader -in product_barcode.jpg
- 输出结果示例:
makefile
✅ 识别成功!
内容: 6901234567890
格式: EAN_13
实践要点
- 图片格式:支持 JPEG/PNG,其他格式(如 BMP、TIFF)需额外导入解码器。
- 清晰度要求:条码识别依赖图像清晰度,模糊、倾斜、曝光过度会影响识别率。
- 批量识别:可以扩展为支持输入文件夹,对其中所有图片逐个识别。
- 并发加速:利用 goroutine 并发识别多张图片,加快批处理速度。
扩展功能
- 批量识别 :
-dir ./images
支持整个文件夹处理。 - 输出 JSON:适合与其他系统集成。
- 集成摄像头:调用摄像头实时扫描条码。
- Web 服务化:提供 REST API,上传图片返回条码内容。
⚡ 总结: 通过 gozxing
,我们用 Go 快速实现了一个条形码识别工具,支持常见的条码/二维码格式,适合用于物流、零售、库存管理等场景。