首页 > 其他分享 >golang生成二维码图片,支持图片下方增加多行居中文本

golang生成二维码图片,支持图片下方增加多行居中文本

时间:2024-05-07 15:03:38浏览次数:14  
标签:err return string nil image img golang 二维码 图片

golang生成二维码图片,支持图片下方增加多行居中文本

效果
image

工具类代码

package Utils

import (
	"bytes"
	"fmt"
	"github.com/golang/freetype/truetype"
	"github.com/skip2/go-qrcode"
	"golang.org/x/image/font"
	"golang.org/x/image/math/fixed"
	"image"
	"image/color"
	"image/draw"
	"image/png"
	"os"
	"regexp"
)

// GenQRCodeImg 生成二维码图片 用法:err := Utils.GenQRCodeImg("https://www.example.com", []string{"设备名称1122室行", "建筑物1-3教室行文字室行室行"}, 300, 20, "D:\\simhei.ttf", "output1.png")
func GenQRCodeImg(url string, textLines []string, qrSize, fontSize int, fontPath, savePath string) error {
	img, err := genQRCode(url, textLines, qrSize, fontSize, fontPath)
	if err != nil {
		return err
	}
	// 保存图片
	outFile, err := os.Create(savePath)
	if err != nil {
		fmt.Println("Error creating output file:", err)
		return err
	}
	defer outFile.Close()
	err = png.Encode(outFile, img)
	return err
}

// GenQRCodeBuffer 生成二维码图片的字节数组 用法:buffer, err := Utils.GenQRCodeBuffer("https://www.example.com", []string{"设备名称1112室行", "建筑物2-3教室行文字室行室行"}, 300, 20, "D:\\simhei.ttf")
func GenQRCodeBuffer(url string, textLines []string, qrSize, fontSize int, fontPath string) (*bytes.Buffer, error) {
	img, err := genQRCode(url, textLines, qrSize, fontSize, fontPath)
	if err != nil {
		return nil, err
	}
	// 将图片编码为字节数组
	var buf bytes.Buffer
	err = png.Encode(&buf, img)
	if err != nil {
		fmt.Println("Error encoding image:", err)
		return nil, err
	}
	return &buf, nil
}

func genQRCode(url string, textLines []string, qrSize, fontSize int, fontPath string) (*image.RGBA, error) {
	// 生成二维码
	qr, err := qrcode.Encode(url, qrcode.Medium, qrSize)
	if err != nil {
		fmt.Println("Error generating QR code:", err)
		return nil, err
	}

	// 解码二维码图片
	qrImg, _, err := image.Decode(bytes.NewReader(qr))
	if err != nil {
		fmt.Println("Error decoding QR code:", err)
		return nil, err
	}

	// 创建新图片,并将二维码绘制在图片上
	img := image.NewRGBA(image.Rect(0, 0, qrSize, qrSize+len(textLines)*(fontSize+10)))
	draw.Draw(img, img.Bounds(), &image.Uniform{color.White}, image.Point{}, draw.Src) // 设置白色背景
	draw.Draw(img, img.Bounds(), qrImg, image.Point{}, draw.Over)

	// 加载字体文件
	fontBytes, err := os.ReadFile(fmt.Sprintf(fontPath))
	if err != nil {
		fmt.Println("Error reading font file:", err)
		return nil, err
	}
	font, err := truetype.Parse(fontBytes)
	if err != nil {
		fmt.Println("Error parsing font:", err)
		return nil, err
	}
	face := truetype.NewFace(font, &truetype.Options{Size: float64(fontSize)})

	// 计算文字的位置
	textY := qrSize - 10 + (len(textLines)-1)*fontSize

	// 绘制文字
	for i, line := range textLines {
		textWidth := countChineseCharacters(line)*fontSize + countNonChineseCharacters(line)*fontSize/2
		textX := (qrSize - textWidth) / 2                                    // 计算每行文字的水平居中位置
		drawText(img, line, textX, textY+i*(fontSize+10), color.Black, face) // 将文字颜色黑色
	}

	return img, nil
}

// 绘制文字
func drawText(img draw.Image, text string, x, y int, c color.Color, face font.Face) {
	d := &font.Drawer{
		Dst:  img,
		Src:  image.NewUniform(c),
		Face: face,
		Dot:  fixed.Point26_6{X: fixed.Int26_6(x * 64), Y: fixed.Int26_6(y * 64)},
	}
	d.DrawString(text)
}

// 计算中文个数
func countChineseCharacters(input string) int {
	// 正则表达式,用于匹配所有中文字符
	chinesePattern := regexp.MustCompile(`[\p{Han}]`)
	// 找到所有匹配的中文字符
	matches := chinesePattern.FindAllString(input, -1)
	// 返回匹配的中文字符数量
	return len(matches)
}

// 计算非中文个数
func countNonChineseCharacters(input string) int {
	// 正则表达式,用于匹配非中文字符
	nonChinesePattern := regexp.MustCompile(`[^\p{Han}]`)
	// 找到所有匹配的非中文字符
	matches := nonChinesePattern.FindAllString(input, -1)
	// 返回匹配的非中文字符数量
	return len(matches)
}

调用

  • 注意将D:\simhei.ttf替换成自己想要的字体文件的路径
package main

import (
    "Utils"
)

func main() {
	Utils.GenQRCodeImg("https://www.example.com", []string{"设备名称1122室行", "建筑物1-3教室行文字室行室行"}, 300, 20, "D:\\simhei.ttf", "output1.png")
}

标签:err,return,string,nil,image,img,golang,二维码,图片
From: https://www.cnblogs.com/jomzhang/p/18177332

相关文章

  • thumbor:功能强大的图片处理库
    Github地址:https://github.com/thumbor/thumborThumbor是一个功能强大的Python图片处理库,可以用于生成、裁剪、缩放、旋转和优化图像,同时还提供了安全性和缓存等功能。本文将详细介绍Thumbor库的特性、用法,并通过丰富的示例代码展示其在实际项目中的应用。Thumbor是一个......
  • 使用pycnblog一键拖拽同步markdown和图片
    目录原因解决办法参考链接准备工作配置config.yaml其他设置图片运行原因本地使用Typora写完文档,上传博客园时,图片不能同步解决办法参考链接博客园上传markdown文件准备工作下载工具pycnblog安装Python3pipinstallpyyaml配置config.yamlblog_url:htt......
  • SwiftUI Image 图片处理
    代码片段////ContentView.swift//SwiftUIImage////CreatedbyCHENHaoon2024/5/6.//importSwiftUIstructContentView:View{varbody:someView{Image("paris").resizable()//延伸模式,平铺整个屏幕/......
  • vue实现使用JSZip批量下载图片
    1importJSZipfrom"jszip";2import{saveAs}from'file-saver';3import$from'jquery'45//jszip打包下载图片6functionsaveImgZip(imgUrlArrs,typeTxt){7varimgUrlArr=[];//图片列表8imgUrlArr=imgUrlAr......
  • golang 获得一个结构体的字节大小
    golang的内存占用是如何构成的呢?unsafe.SizeOf()转载:如何在Go中获取变量的内存大小?--CSDN问答如果传递一个未初始化的变量,unsafe.Sizeof()与reflect.Type.Size()将只返回传递的变量的类型的大小,并不递归地遍历数据结构并增加所指向变量的大小。切片是一个相对简单的结构体st......
  • 用Golang做一个永久阻塞,有哪些小技巧 ?
    用Golang做一个永久阻塞,有哪些小技巧?磊丰 Go语言圈 2024-05-0608:30 广东 听全文Go语言圈Go语言开发者的学习好助手,分享Go语言知识,技术技巧,学习与交流Go语言开发经验,互动才有助于技术的提升,每天5分钟,助你GO语言技术快乐成长159篇原创内容公众号......
  • MuMu模拟器12如何将电脑的文件/图片导入到模拟器根目录
    前言全局说明官方说明:https://mumu.163.com/help/20230427/35047_1085406.html一、说明二、部分用户在使用MuMu模拟器12时,可能会需要将电脑的图片或文件一类的,从电脑内导入到模拟器根目录中,但是不知道具体该如何操作,遇到这类情况的用户,可以参考以下步骤操作。第一步......
  • pyqt5设计图片背景和颜色
        tianqi.qrc 根据大小重新 <RCC><qresourceprefix="media"><file>天气.jpg</file><file>音乐.jpg</file><file>map.png</file><file>车.png</file></qresource></RCC>......
  • 为什么我要使得GOLang重写SAAS(软件即服务)服务端
    引言“道”在中国哲学中,是一个重要的概念,表示“终极真理”。“道”这一概念,不单为哲学流派诸子百家所重视,也被宗教流派道教等所使用。大道至简的意思就是大道理是极其简单的,简单到一两句话就能说明白。所谓“真传一句话,假传万卷书”。正文在开启独立创作之路之前,我主要用不用......
  • Golang:go-humanize将文件大小转换成Kb、Mb、Gb适合人类阅读的单位
    Golang:go-humanize将文件大小转换成Kb、Mb、Gb适合人类阅读的单位原创 吃个大西瓜 CodingBigTree 2024-05-0408:30 云南​最近去了昆明的教场中路体验了满屏蓝花楹,感受到了梦幻般的世界,随手拍了一张图,分享给大家,有时间可以去一趟,体验一次,顺便说一下,美女很多喔 ......