Go使用命令行输出二维码
引言
二维码(QR code)是一种矩阵条码的标准,广泛应用于商业、移动支付和数据存储等领域。在开发过程中,我们可能需要在命令行中显示二维码,这可以帮助我们快速生成和分享二维码信息。本文将介绍如何使用Go语言生成二维码并在命令行中输出。
安装必要依赖
在开始之前,我们需要安装一个用于生成二维码的Go库。推荐使用github.com/skip2/go-qrcode,它是一个被广泛使用的库,提供了生成和编码二维码的功能。在终端中执行以下命令来安装依赖库:
go get github.com/skip2/go-qrcode
生成二维码
创建一个新的Go文件
首先,创建一个新的Go文件,我们可以将其命名为main.go。接下来,我们将引入必要的包并定义我们的主函数。
package mainimport ("github.com/skip2/go-qrcode""os"
)func main() {// 代码逻辑将在后续的章节中实现
}
生成二维码图片
我们可以使用go-qrcode库的QRCode.WriteTo方法来生成并保存二维码图片。下面是一个生成二维码并保存为PNG格式图片的示例代码:
package mainimport ("github.com/skip2/go-qrcode""os"
)func main() {// 生成二维码qrcode, err := qrcode.New("https://www.example.com", qrcode.Low)if err != nil {panic(err)}// 保存二维码为PNG格式图片file, err := os.Create("qrcode.png")if err != nil {panic(err)}defer file.Close()err = qrcode.WriteTo(file)if err != nil {panic(err)}// 输出完成信息println("二维码已生成并保存为qrcode.png")
}
使用命令行输出二维码
到目前为止,我们已经能够生成并保存二维码图片了。为了在命令行中显示二维码,我们需要使用一些更高级的技巧。
生成 ASCII 二维码
要在命令行中显示二维码,我们可以将二维码转换为ASCII字符,从而在终端中输出。下面是一个生成ASCII二维码并在终端中输出的示例代码:
package mainimport ("fmt""github.com/skip2/go-qrcode"
)func main() {// 生成二维码qrcode, err := qrcode.New("https://www.example.com", qrcode.Low)if err != nil {panic(err)}// 将二维码转换为ASCII字符ascii := qrcode.ToSmallString(false)// 输出二维码fmt.Println(ascii)
}
使用 ASCII 色彩
为了使命令行二维码更具可读性,我们可以使用ASCII颜色。go-qrcode库提供了NewWithColor函数,我们可以将自定义的前景色和背景色传递给该函数,以生成彩色的ASCII二维码。下面是一个使用ASCII颜色输出二维码的示例代码:
package mainimport ("fmt"qrcode "github.com/skip2/go-qrcode"
)func main() {// 调整前景色和背景色var fgColor = "\033[38;5;208m" // 设置前景色为橙色var bgColor = "\033[48;5;0m" // 设置背景色为黑色// 生成彩色 ASCII 二维码qr, err := qrcode.NewWithColor("https://www.example.com", qrcode.Low, fgColor, bgColor)if err != nil {panic(err)}// 将二维码转换为 ASCII 字符ascii := qr.ToSmallString(false)// 输出二维码fmt.Println(ascii)
}
案例
案例一:生成带 Logo 的二维码
有时候我们可能希望在二维码中添加自定义的Logo图标,以增加品牌标识或者美观度。通过使用"go-qrcode"库,我们可以轻松实现这个功能。下面是一个示例代码:
package mainimport ("fmt"qrcode "github.com/skip2/go-qrcode""image""image/draw""image/jpeg""os"
)func main() {// 生成二维码qr, err := qrcode.New("https://www.example.com", qrcode.Low)if err != nil {panic(err)}// 加载 Logo 图片logoImgFile, err := os.Open("logo.jpg")if err != nil {panic(err)}defer logoImgFile.Close()logoImg, _, err := image.Decode(logoImgFile)if err != nil {panic(err)}// 创建带 Logo 的画布qrWithLogo := image.NewRGBA(qr.Bounds())draw.Draw(qrWithLogo, qr.Bounds(), qr, image.Point{}, draw.Over)// 在二维码上添加 LogologoSize := qr.Bounds().Dx() / 4 // 设置Logo尺寸logoRect := image.Rect(qr.Bounds().Dx()/2-logoSize/2, qr.Bounds().Dy()/2-logoSize/2, qr.Bounds().Dx()/2+logoSize/2, qr.Bounds().Dy()/2+logoSize/2)draw.Draw(qrWithLogo, logoRect, logoImg, image.Point{}, draw.Over)// 保存带 Logo 的二维码为图片文件qrWithLogoFile, err := os.Create("qr_with_logo.jpg")if err != nil {panic(err)}defer qrWithLogoFile.Close()jpeg.Encode(qrWithLogoFile, qrWithLogo, nil)fmt.Println("二维码图片生成成功,已添加Logo!")
}
在上述示例中,我们首先生成了一个普通的二维码。然后,我们加载了一个Logo图片,并创建了一个与二维码相同尺寸的画布。接下来,我们将二维码和Logo合并到同一个画布上,并保存为一张带Logo的二维码图片。
案例二:解码二维码图片
除了生成和输出二维码,我们还可以使用"go-qrcode"库来解码已有的二维码图片。下面是一个示例代码:
package mainimport ("fmt"qrcode "github.com/skip2/go-qrcode""image/jpeg""os"
)func main() {// 加载二维码图片qrImgFile, err := os.Open("qrcode.jpg")if err != nil {panic(err)}defer qrImgFile.Close()qrImg, err := jpeg.Decode(qrImgFile)if err != nil {panic(err)}// 解码二维码图片qrCode, err := qrcode.Decode(qrImg)if err != nil {panic(err)}fmt.Println("二维码解码成功!")fmt.Println("解码结果:", qrCode.Content)
}
在上述示例中,我们加载了一张带有二维码的图片。然后,我们使用qrcode.Decode函数解码该图片,并获取二维码所代表的内容。最后,我们输出解码结果。
案例三:生成可调整大小的二维码
有时我们可能希望生成可根据需要调整大小的二维码。"go-qrcode"库允许我们指定所需的尺寸,以生成我们想要的大小的二维码。下面是一个示例代码:
package mainimport ("fmt"qrcode "github.com/skip2/go-qrcode""image/png""os"
)func main() {// 生成二维码qr, err := qrcode.NewWithSize("https://www.example.com", qrcode.Low, 512)if err != nil {panic(err)}// 将二维码保存为 PNG 图片文件qrFile, err := os.Create("qr.png")if err != nil {panic(err)}defer qrFile.Close()png.Encode(qrFile, qr.Image())fmt.Println("可调整大小的二维码生成成功!")
}
在上述示例中,我们使用qrcode.NewWithSize函数来生成一个指定大小(512x512)的二维码。最后,我们将生成的二维码保存为一个PNG图片文件。
希望这些案例能帮助你更好地理解和使用"go-qrcode"库来生成和处理二维码。
总结
在本文中,我们学习了如何使用Go语言生成和输出二维码。通过使用github.com/skip2/go-qrcode库,我们可以轻松地生成二维码图片,并将其保存为文件或输出到命令行。此外,我们还了解了如何将二维码转换为ASCII字符和使用ASCII颜色生成彩色的命令行二维码。希望这篇文章对你在Go项目中生成和输出二维码有所帮助!
相关文章:
Go使用命令行输出二维码
引言 二维码(QR code)是一种矩阵条码的标准,广泛应用于商业、移动支付和数据存储等领域。在开发过程中,我们可能需要在命令行中显示二维码,这可以帮助我们快速生成和分享二维码信息。本文将介绍如何使用Go语言生成二维…...
最长连续序列[中等]
优质博文:IT-BLOG-CN 一、题目 给定一个未排序的整数数组nums,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。请你设计并实现时间复杂度为O(n)的算法解决此问题。 示例 1: 输入:nums […...
设计模式-状态模式-笔记
状态模式State 在组件构建过程中,某些对象的状态经常面临变化,如何对这些变化进行有效的管理?同时又维持高层模块的稳定?“状态变化”模式为这一问题提供了一种解决方案。 经典模式:State、Memento 动机(…...
Java中for、foreach、stream区别和性能比较
文章目录 性能比较区别使用方式和行为 性能比较 最终总结:如果数据在1万以内的话,for循环效率高于foreach和stream;如果数据量在10万的时候,stream效率最高,其次是foreach,最后是for。另外需要注意的是如果数据达到10…...
[CSS] 文本折行
文本折行一般分为两种情况: CJK(Chinese/Japanese/Korean) 字符和非 CJK 字符。一般非 CJK 字符折行发生在两个单词的空格中间,见下图: 图中文本 “hello world” 包裹容器的宽度为 2rem,但是 hello 并没有…...
033-从零搭建微服务-日志插件(一)
写在最前 如果这个项目让你有所收获,记得 Star 关注哦,这对我是非常不错的鼓励与支持。 源码地址(后端):mingyue: 🎉 基于 Spring Boot、Spring Cloud & Alibaba 的分布式微服务架构基础服务中心 源…...
短期经济波动:均衡国民收入决定理论(三)
短期经济波动:国民收入决定理论(三) 文章目录 短期经济波动:国民收入决定理论(三)[toc]1 总需求曲线及其变动1.1 总需求曲线含义1.2 总需求曲线推导1.2.1 代数推导1.2.2 几何推导 1.3 AD曲线及其变动1.3.1 扩张性财政政策1.3.2 扩张性货币政策 2 总供给曲…...
电力感知边缘计算网关产品设计方案-网关软件架构
边缘计算网关采用ARM定制硬件平台架构,包含上位机端(内网)和FPGA网关端(外网)两部分,通过芯片间的高速信号总线实现边缘计算网关工业数据采集、数据实时传输、数据存储、网关状态信息收集等功能。 边缘计算网关上位机端(内网)重点完成工业数据采集、业务软件运算、客户…...
最新AI创作系统ChatGPT系统运营源码/支持最新GPT-4-Turbo模型/支持DALL-E3文生图
一、AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统,支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美,可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如…...
Java使用Redis的几种客户端介绍
Redis是一种高性能的内存数据库,可以提供快速的数据读写操作。在Java中使用Redis,需要使用Redis客户端。目前,Java中常用的Redis客户端有以下几种: Jedis Jedis是Java中最流行的Redis客户端之一,它提供了丰富的API和…...
程序员的护城河
程序员的护城河 算法,一定是过硬的算法!!!举个栗子:算法不硬吃大亏写在最后 算法,一定是过硬的算法!!! 其实会什么技术不重要,掌握多少种编程语言也不重要&a…...
常见面试题-MySQL软删除以及索引结构
为什么 mysql 删了行记录,反而磁盘空间没有减少? 答: 在 mysql 中,当使用 delete 删除数据时,mysql 会将删除的数据标记为已删除,但是并不去磁盘上真正进行删除,而是在需要使用这片存储空间时…...
信号的机制——信号处理函数的注册
在 Linux 操作系统中,为了响应各种各样的事件,也是定义了非常多的信号。我们可以通过 kill -l 命令,查看所有的信号。 # kill -l1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP6) SIGABRT 7) SIGBUS …...
JS-项目实战-鼠标悬浮变手势(鼠标放单价上生效)
1、鼠标悬浮和离开事件.js //当页面加载完成后执行后面的匿名函数 window.onload function () {//get:获取 Element:元素 By:通过...方式//getElementById()根据id值获取某元素let fruitTbl document.getElementById("fruit_tbl");//table.rows:获取这个表格…...
redis运维(十一) python操作redis
一 python操作redis ① 安装pyredis redis常见错误 说明:由于redis服务器是5.0.8的,为了避免出现问题,默认最高版本的即可 --> 适配 ② 操作流程 核心:获取redis数据库连接对象 ③ Python 字符串前面加u,r,b的含义 原因: 字符串在…...
黑马程序员微服务 第五天课程 分布式搜索引擎2
分布式搜索引擎02 在昨天的学习中,我们已经导入了大量数据到elasticsearch中,实现了elasticsearch的数据存储功能。但elasticsearch最擅长的还是搜索和数据分析。 所以今天,我们研究下elasticsearch的数据搜索功能。我们会分别使用DSL和Res…...
什么是UV贴图?
UV 是与几何图形的顶点信息相对应的二维纹理坐标。UV 至关重要,因为它们提供了表面网格与图像纹理如何应用于该表面之间的联系。它们基本上是控制纹理上哪些像素对应于 3D 网格上的哪个顶点的标记点。它们在雕刻中也很重要。 为什么UV映射很重要? 默认情…...
从哪里下载 Oracle database 11g 软件
登入My Oracle Support,选择Patches & Updates 标签页,点击下方的Latest Patchsets链接: 然后单击Oracle Database,就可以下载11g软件了: 安装单实例数据库需要1和2两个zip文件,安装GI需要第3个zip文…...
Ingress安全网关
目录 文章目录 目录本节实战TCP 流量拆分🚩 实战:TCP 流量拆分-2023.11.15(测试成功) Ingress安全网关Kubernetes Ingress🚩 实战:Kubernetes Ingress-2023.11.15(测试成功) Ingress GatewayIngress Gateway🚩 实战&am…...
Jmeter控制RPS
一、前言 RPS (Request Per Second)一般用来衡量服务端的吞吐量,相比于并发模式,更适合用来摸底服务端的性能。我们可以通过使用 JMeter 的常数吞吐量定时器来限制每个线程的RPS。对于RPS,我们可以把他理解为我们的TPS,我们就不…...
23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...
【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...
P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...
浅谈不同二分算法的查找情况
二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况…...
在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
