golang 解析二维码 (golang qrcode detect)

引入一个gozxing包。 java,python 都有基于zxing 的二维码解析包 实现的还都不错 java的要早一些。都是同一个作者写的。gozxing github address

我这个demo 是先上传文件(图片)。然后将文件流写入到gozxing 的函数中解析二维码就可以了。如果你不想上传文件 可以直接用os.Open(“hello.png”) 来打开也可以

废话不多说,直接上代码。需要注意的几个点 我会截图说明!!!!!

package main

import (
	"fmt"
	"image"
	_ "image/gif"
	_ "image/jpeg"
	_ "image/png"
	"github.com/makiuchi-d/gozxing"
	"github.com/makiuchi-d/gozxing/qrcode"
	"github.com/gin-gonic/gin"
	"net/http"
	"io"
)

func main() {
	router := gin.Default()
	router.POST("/upload", func(c *gin.Context) {
		// The default memory allocation is 10M
		file, err := c.FormFile("filename")
		if err != nil {
			c.String(http.StatusBadRequest, fmt.Sprintf("get form err: %s", err.Error()))
			return
		}

		//文件大小限制
		if file.Size > (10 << 20) {
			c.String(http.StatusBadRequest, fmt.Sprintf("get form err: %s", "文件太大,请重新上传"))
			return
		}

		c.String(http.StatusOK, fmt.Sprintf("File %s uploaded success", file.Filename))
		//fmt.Println(file.Filename, "文件名")
		fi, err := file.Open()
		if err != nil {
			fmt.Println(err)
		}
		defer fi.Close()

		str := GetPaymentStr(fi).String()
		fmt.Println("qrcode_url:", str)
	})
	router.Run(":8000")
}

func GetPaymentStr(fi io.Reader) (paymentCodeUrl *gozxing.Result) {
	img, _, err := image.Decode(fi)
	if err != nil {
		fmt.Println(err)
	}
	// prepare BinaryBitmap
	bmp, _ := gozxing.NewBinaryBitmapFromImage(img)
	// decode image
	qrReader := qrcode.NewQRCodeReader()
	result, err := qrReader.Decode(bmp, nil)
	if err != nil {
		fmt.Println(err)
	}

	return result
}

result:

golang 解析二维码 (golang qrcode detect)_第1张图片

需要注意的点1 :文件的格式

golang 解析二维码 (golang qrcode detect)_第2张图片

需要注意的点2 :流的关闭

golang 解析二维码 (golang qrcode detect)_第3张图片

需要注意的点3 :流的使用

golang 解析二维码 (golang qrcode detect)_第4张图片

有问题 请直接留言!!! 欢迎讨论

你可能感兴趣的:(golang)