golang原生高质量极简QR码生成插件库go-qr的使用

Golang原生高质量极简QR码生成插件库go-qr的使用

概述

go-qr是一个原生、高质量且极简的Go语言QR码生成库。它可以从字符串文本生成QR码,主要基于Nayuki的Java版本QR码生成器库的翻译实现。

特性

  • 极简的原生代码实现
  • 基于QR Code Model 2标准,支持所有40个版本和4个纠错级别
  • 输出格式:QR符号的原始模块/像素
  • 比其他实现更准确地检测finder-like惩罚模式
  • 对数字和特殊字母数字文本的编码空间优化
  • 日文Unicode文本编码优化
  • 对于混合数字/字母数字/通用/汉字文本,计算最优分段模式切换
  • 良好的测试覆盖率
  • MIT开源许可证

安装

go get github.com/piglig/go-qr

示例代码

package main

import (
	go_qr "github.com/piglig/go-qr"
	"image/color"
)

func main() {
	doBasicDemo()
}

func doBasicDemo() {
	text := "Hello, world!"
	errCorLvl := go_qr.Low
	qr, err := go_qr.EncodeText(text, errCorLvl)
	if err != nil {
		return
	}
	config := go_qr.NewQrCodeImgConfig(10, 4)
	err = qr.PNG(config, "hello-world-QR.png")
	if err != nil {
		return
	}

	err = qr.SVG(config, "hello-world-QR.svg", "#FFFFFF", "#000000")
	if err != nil {
		return
	}

	err = qr.SVG(go_qr.NewQrCodeImgConfig(10, 4, go_qr.WithSVGXMLHeader(true)), "hello-world-QR-xml-header.svg", "#FFFFFF", "#000000")
	if err != nil {
		return
	}
}

命令行工具

安装

要使用该工具,请使用以下命令编译:

go install github.com/piglig/go-qr/tools/generator@latest

使用

generator [options] [arguments]
  -content string
        Content to encode in the QR code
  -png string
        Output PNG file name
  -svg string
        Output SVG file name
  -svg-optimized
        Output optimized SVG file name - regions with connected black pixels are merged into a single path

示例

  • 文本艺术
generator -content hello
  • 图像类型
generator -content hello -png hello.png -svg hello.svg
  • 优化的SVG类型
generator -content hello -svg hello.svg -svg-optimized hello-optimized.svg 

优化的SVG输出会围绕连接的黑色区域创建路径,这减少了文件大小和渲染伪影。

许可证

MIT开源许可证。


更多关于golang原生高质量极简QR码生成插件库go-qr的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang原生高质量极简QR码生成插件库go-qr的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


go-qr: 极简高效的Go语言QR码生成库

go-qr 是一个轻量级、高质量的纯Go语言QR码生成库,不依赖任何外部C库或系统组件。下面我将详细介绍其使用方法和最佳实践。

安装

go get github.com/yeqown/go-qrcode/v2
go get github.com/yeqown/go-qrcode/writer/standard

基本使用

1. 生成最简单的QR码

package main

import (
	"github.com/yeqown/go-qrcode/v2"
	"github.com/yeqown/go-qrcode/writer/standard"
	"log"
)

func main() {
	qrc, err := qrcode.New("https://github.com/yeqown/go-qrcode")
	if err != nil {
		log.Fatalf("could not generate QRCode: %v", err)
	}

	// 保存为PNG文件
	w, err := standard.New("simple-qrcode.png")
	if err != nil {
		log.Fatalf("standard.New failed: %v", err)
	}

	if err = qrc.Save(w); err != nil {
		log.Fatalf("could not save image: %v", err)
	}
}

2. 自定义QR码样式

func generateCustomQR() {
	qrc, err := qrcode.NewWith(
		"https://github.com/yeqown/go-qrcode",
		qrcode.WithEncodingMode(qrcode.EncModeByte),
		qrcode.WithErrorCorrectionLevel(qrcode.ErrorCorrectionHighest),
	)
	if err != nil {
		log.Fatal(err)
	}

	// 自定义写入器选项
	wr := standard.NewWithWriter(
		os.Stdout,
		standard.WithBgColorRGBHex("#FFFFFF"),
		standard.WithFgColorRGBHex("#000000"),
		standard.WithQRWidth(20), // 每个模块的像素大小
		standard.WithBorderWidth(40),
		standard.WithLogoImageFilePNG("logo.png", 100), // 添加logo
	)

	if err = qrc.Save(wr); err != nil {
		log.Fatal(err)
	}
}

高级功能

1. 生成到内存而非文件

func generateToMemory() []byte {
	qrc, err := qrcode.New("https://github.com")
	if err != nil {
		log.Fatal(err)
	}

	var buf bytes.Buffer
	wr := standard.NewWithWriter(&buf, standard.WithQRWidth(10))

	if err = qrc.Save(wr); err != nil {
		log.Fatal(err)
	}

	return buf.Bytes()
}

2. 生成SVG格式QR码

func generateSVG() {
	qrc, err := qrcode.New("SVG QR Code")
	if err != nil {
		log.Fatal(err)
	}

	// 需要额外导入 svg writer
	// go get github.com/yeqown/go-qrcode/writer/svg
	wr := svg.NewWith(
		"qrcode.svg",
		svg.WithBgColorRGBHex("#FFFFFF"),
		svg.WithFgColorRGBHex("#000000"),
		svg.WithLogoImageFilePNG("logo.png", 100),
	)

	if err = qrc.Save(wr); err != nil {
		log.Fatal(err)
	}
}

3. 动态生成QR码并返回HTTP响应

func qrHandler(w http.ResponseWriter, r *http.Request) {
	text := r.URL.Query().Get("text")
	if text == "" {
		text = "default content"
	}

	qrc, err := qrcode.New(text)
	if err != nil {
		http.Error(w, err.Error(), http.StatusInternalServerError)
		return
	}

	wr := standard.NewWithWriter(w, standard.WithQRWidth(8))
	w.Header().Set("Content-Type", "image/png")
	if err = qrc.Save(wr); err != nil {
		http.Error(w, err.Error(), http.StatusInternalServerError)
	}
}

性能优化建议

  1. 复用QRCode对象:如果需要生成大量相似QR码,可以复用QRCode对象

  2. 选择合适的纠错级别:根据使用场景选择适当的纠错级别

    • ErrorCorrectionLow (7%错误可恢复)
    • ErrorCorrectionMedium (15%)
    • ErrorCorrectionQuart (25%)
    • ErrorCorrectionHighest (30%)
  3. 控制模块大小WithQRWidth()参数影响生成图片的大小和质量

与其他库的比较

go-qr相比其他Go QR码生成库有以下优势:

  • 纯Go实现,无外部依赖
  • 支持多种输出格式(PNG, SVG, 内存等)
  • 丰富的自定义选项
  • 高性能,支持并发生成
  • 活跃的维护和社区支持

总结

go-qr是一个功能强大但使用简单的QR码生成库,适合各种场景下的QR码生成需求。通过简单的API调用即可生成高质量的QR码,并支持丰富的自定义选项。无论是简单的文本编码还是复杂的带logo的QR码,go-qr都能轻松应对。

更多高级用法和示例可以参考项目的GitHub仓库:github.com/yeqown/go-qrcode

回到顶部