golang生成个性化样式QR码插件库go-qrcode的使用

go-qrcode - Golang生成个性化样式QR码插件库

简介

QR码(Quick Response Code)是一种矩阵二维码,最初于1994年为日本汽车行业设计。它是一种包含信息的机器可读光学标签。go-qrcode是一个功能强大的Golang库,可以生成各种个性化样式的QR码。

特性

  • 支持生成版本1到版本40的QR码
  • 自动根据源文本分析QR码版本
  • 可自定义单元格形状(默认矩形,支持圆形等)
  • 可指定输出文件格式(默认JPEG)
  • 可自定义QR码前景色和背景色
  • 支持在QR码中心添加Logo图标
  • 可自定义QR码边框宽度
  • 支持WebAssembly
  • 支持半色调QR码

安装

go get -u github.com/yeqown/go-qrcode/v2

快速开始

package main

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

func main() {
	// 创建QR码
	qrc, err := qrcode.New("https://github.com/yeqown/go-qrcode")
	if err != nil {
		fmt.Printf("could not generate QRCode: %v", err)
		return
	}
	
	// 创建标准写入器
	w, err := standard.New("qrcode.jpeg")
	if err != nil {
		fmt.Printf("standard.New failed: %v", err)
		return
	}
	
	// 保存QR码图片
	if err = qrc.Save(w); err != nil {
		fmt.Printf("could not save image: %v", err)
	}
}

选项配置

// 编码模式选项
const (
	EncModeNone encMode = 1 << iota  // 无模式
	EncModeNumeric                   // 数字模式
	EncModeAlphanumeric              // 字母数字模式
	EncModeByte                      // 字节模式
	EncModeJP                        // 日文模式
)

// 错误纠正级别
const (
	ErrorCorrectionLow ecLevel = iota + 1    // L级: 7%错误恢复
	ErrorCorrectionMedium                    // M级: 15%错误恢复(默认)
	ErrorCorrectionQuart                     // Q级: 25%错误恢复
	ErrorCorrectionHighest                   // H级: 30%错误恢复
)

// 使用示例
qrc, err := qrcode.New(
	"content",
	qrcode.WithEncodingMode(EncModeByte),
	qrcode.WithErrorCorrectionLevel(ErrorCorrectionHighest),
)

示例效果

效果 说明
bg-fg color 自定义前景背景色
transparent 透明背景
border padding 边框宽度
circle shape 圆形单元格
fg gradient 前景渐变
halftone 半色调效果
logo 添加Logo
block width 自定义块宽度
custom shape 自定义形状

内置写入器

  • 标准写入器: 将QR码写入文件和流
  • 终端写入器: 在终端打印QR码
  • 文件写入器: 将QR码写入文件
  • 压缩写入器: 生成小尺寸QR码

你也可以实现自己的写入器,只需实现Writer接口。

从v1迁移

go-qrcode.v2是对v1的重大升级,不向后兼容。v2重新设计了API,更加灵活和强大。功能按模块划分:

完整示例

package main

import (
	"fmt"
	"image/color"
	
	"github.com/yeqown/go-qrcode/v2"
	"github.com/yeqown/go-qrcode/writer/standard"
)

func main() {
	// 创建带选项的QR码
	qrc, err := qrcode.New(
		"https://github.com/yeqown/go-qrcode",
		qrcode.WithEncodingMode(qrcode.EncModeByte),
		qrcode.WithErrorCorrectionLevel(qrcode.ErrorCorrectionHighest),
		qrcode.WithLogoImageFilePNG("logo.png"), // 添加Logo
	)
	if err != nil {
		fmt.Printf("could not generate QRCode: %v", err)
		return
	}
	
	// 创建带样式的写入器
	w, err := standard.New(
		"custom-qrcode.png",
		standard.WithQRWidth(10), // 设置块宽度
		standard.WithBorderWidth(20), // 设置边框宽度
		standard.WithFgColor(color.RGBA{R: 0, G: 0, B: 128, A: 255}), // 前景色
		standard.WithBgColor(color.RGBA{R: 255, G: 255, B: 255, A: 128}), // 半透明背景
		standard.WithCircleShape(), // 圆形单元格
	)
	if err != nil {
		fmt.Printf("standard.New failed: %v", err)
		return
	}
	
	// 保存QR码
	if err = qrc.Save(w); err != nil {
		fmt.Printf("could not save image: %v", err)
	}
}

这个示例展示了如何创建一个带Logo、自定义颜色、圆形单元格和半透明背景的QR码。


更多关于golang生成个性化样式QR码插件库go-qrcode的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang生成个性化样式QR码插件库go-qrcode的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


使用go-qrcode生成个性化样式QR码

go-qrcode是一个简单易用的Go语言QR码生成库,支持自定义颜色、大小和样式。下面我将详细介绍如何使用这个库来生成个性化QR码。

基本安装

首先安装go-qrcode库:

go get github.com/skip2/go-qrcode

基本用法

生成简单QR码

package main

import (
	"github.com/skip2/go-qrcode"
	"log"
)

func main() {
	// 生成QR码并保存为PNG文件
	err := qrcode.WriteFile("https://example.com", qrcode.Medium, 256, "qrcode.png")
	if err != nil {
		log.Fatal(err)
	}
}

参数说明:

  • 第一个参数:要编码的内容
  • 第二个参数:纠错等级(Low/Medium/High/Highest)
  • 第三个参数:图片大小(像素)
  • 第四个参数:输出文件名

生成QR码到内存

func generateQRToMemory(content string) ([]byte, error) {
    qr, err := qrcode.New(content, qrcode.Medium)
    if err != nil {
        return nil, err
    }
    
    // 自定义设置
    qr.BackgroundColor = color.RGBA{0xff, 0xff, 0xff, 0xff} // 白色背景
    qr.ForegroundColor = color.RGBA{0x00, 0x00, 0x00, 0xff} // 黑色前景
    
    return qr.PNG(256)
}

高级自定义

自定义颜色

func coloredQR() {
    qr, err := qrcode.New("https://example.com", qrcode.Medium)
    if err != nil {
        log.Fatal(err)
    }
    
    // 设置前景色(QR码本身颜色)为蓝色
    qr.ForegroundColor = color.RGBA{0, 0, 255, 255}
    // 设置背景色为浅灰色
    qr.BackgroundColor = color.RGBA{230, 230, 230, 255}
    
    // 保存为文件
    err = qr.WriteFile(256, "colored_qr.png")
    if err != nil {
        log.Fatal(err)
    }
}

添加Logo到QR码中心

func qrWithLogo() {
    qr, err := qrcode.New("https://example.com", qrcode.High)
    if err != nil {
        log.Fatal(err)
    }
    
    // 读取logo图片
    logoFile, err := os.Open("logo.png")
    if err != nil {
        log.Fatal(err)
    }
    defer logoFile.Close()
    
    logoImg, _, err := image.Decode(logoFile)
    if err != nil {
        log.Fatal(err)
    }
    
    // 将logo添加到QR码
    qrImg := qr.Image(256)
    pos := qrImg.Bounds().Max.X/2 - logoImg.Bounds().Max.X/2
    
    draw.Draw(
        qrImg, 
        image.Rect(pos, pos, pos+logoImg.Bounds().Max.X, pos+logoImg.Bounds().Max.Y),
        logoImg, 
        image.Point{}, 
        draw.Over,
    )
    
    // 保存结果
    outFile, err := os.Create("qr_with_logo.png")
    if err != nil {
        log.Fatal(err)
    }
    defer outFile.Close()
    
    err = png.Encode(outFile, qrImg)
    if err != nil {
        log.Fatal(err)
    }
}

生成圆形点样式的QR码

func roundedQR() {
    qr, err := qrcode.New("https://example.com", qrcode.Medium)
    if err != nil {
        log.Fatal(err)
    }
    
    qr.DisableBorder = true // 移除边框
    
    // 创建圆形点样式
    img := qr.Image(256)
    bounds := img.Bounds()
    width := bounds.Max.X - bounds.Min.X
    height := bounds.Max.Y - bounds.Min.Y
    
    // 创建新图像
    rounded := image.NewRGBA(bounds)
    draw.Draw(rounded, bounds, image.White, image.Point{}, draw.Src)
    
    // 绘制圆形点
    dotSize := width / (len(qr.Bitmap()) + 2)
    radius := dotSize / 2
    
    for y, row := range qr.Bitmap() {
        for x, bit := range row {
            if bit {
                cx := x*dotSize + radius
                cy := y*dotSize + radius
                
                draw.DrawMask(
                    rounded,
                    image.Rect(cx-radius, cy-radius, cx+radius, cy+radius),
                    image.Black,
                    image.Point{},
                    &circle{image.Point{cx, cy}, radius},
                    image.Point{},
                    draw.Over,
                )
            }
        }
    }
    
    // 保存结果
    outFile, err := os.Create("rounded_qr.png")
    if err != nil {
        log.Fatal(err)
    }
    defer outFile.Close()
    
    err = png.Encode(outFile, rounded)
    if err != nil {
        log.Fatal(err)
    }
}

// 圆形形状定义
type circle struct {
    p image.Point
    r int
}

func (c *circle) ColorModel() color.Model {
    return color.AlphaModel
}

func (c *circle) Bounds() image.Rectangle {
    return image.Rect(c.p.X-c.r, c.p.Y-c.r, c.p.X+c.r, c.p.Y+c.r)
}

func (c *circle) At(x, y int) color.Color {
    xx, yy, rr := float64(x-c.p.X)+0.5, float64(y-c.p.Y)+0.5, float64(c.r)
    if xx*xx+yy*yy < rr*rr {
        return color.Alpha{255}
    }
    return color.Alpha{0}
}

性能考虑

对于需要生成大量QR码的应用,可以考虑以下优化:

  1. 复用qrcode对象
  2. 使用适当的纠错等级(不需要高纠错时使用Low或Medium)
  3. 批量处理时使用goroutine并行生成
func batchGenerateQR(contents []string) {
    var wg sync.WaitGroup
    for i, content := range contents {
        wg.Add(1)
        go func(idx int, text string) {
            defer wg.Done()
            fileName := fmt.Sprintf("qrcode_%d.png", idx)
            err := qrcode.WriteFile(text, qrcode.Medium, 256, fileName)
            if err != nil {
                log.Printf("Error generating %s: %v", fileName, err)
            }
        }(i, content)
    }
    wg.Wait()
}

总结

go-qrcode库提供了简单而强大的QR码生成功能,通过自定义颜色、添加Logo和修改点样式,可以创建各种个性化的QR码。根据实际需求选择合适的纠错等级和大小,可以在保证扫描成功率的同时实现美观的设计效果。

对于更高级的需求,可以结合其他图像处理库如gg或imaging进行更复杂的样式设计。

回到顶部