C#生成二维码和条形码
C# 实现二维码和条形码生成:从入门到实战
文章目录
- C# 实现二维码和条形码生成:从入门到实战
- 一、引言
- 二、准备工作
- 2.1 开发环境搭建
- 2.2 引入相关库
- 三、生成条形码
- 3.1 条形码基本概念
- 3.2 使用[ZXing.Net](https://ZXing.Net)生成条形码
- 3.2.1 核心代码实现
- 3.2.2 代码调用与测试
- 四、生成二维码
- 4.1 二维码基本概念
- 4.2 使用[ZXing.Net](https://ZXing.Net)生成二维码
- 4.2.1 核心代码实现
- 4.2.2 代码调用与测试
- 五、生成带 Logo 的二维码
- 5.1 实现思路
- 5.2 代码实现
一、引言
最近项目开发中遇到了使用字符串生成二维码和条形码的需求,所以对这些知识做一个总结,方便后续参考。
二、准备工作
2.1 开发环境搭建
本文使用的开发工具是 Visual Studio 2022,创建的是WPF应用程序,项目创建过程不再赘述。
2.2 引入相关库
在 C# 中生成二维码和条形码,我们将使用ZXing.Net库。这是一个开源的库,支持生成和解析多种格式的二维码和条形码。下面是引入ZXing.Net库的详细步骤:
(1)在 Visual Studio 的 “解决方案资源管理器” 中,右键点击项目名称,选择 “管理 NuGet 程序包”。
(2)在打开的 “NuGet 包管理器” 窗口中,切换到 “浏览” 选项卡。
(3)在搜索框中输入 “ZXing.Net”,然后点击搜索按钮。
(4)在搜索结果中找到 “ZXing.Net” 包,点击 “安装” 按钮。
(5)阅读并接受许可协议,等待安装完成。
(6)安装完成后,在 “解决方案资源管理器” 的 “依赖项”->“包” 中可以看到 “ZXing.Net”,这表示库已经成功引入项目。
三、生成条形码
3.1 条形码基本概念
条形码是将宽度不等的多个黑条和空白,按照一定的编码规则排列,用以表达一组信息的图形标识符 。常见的条形码是由反射率相差很大的黑条(简称条)和白条(简称空)排成的平行线图案。常见的条形码类型有 Code 39、Code 128、EAN-13 等。Code 39 码可表示数字、字母等信息,常用于工业、图书及票证的自动化管理;Code 128 码能表示 ASCII 0 到 ASCII 127 共计 128 个 ASCII 字符,在物流包裹追踪等场景中常用;EAN-13 码是国际物品编码协会制定的一种商品用条码,通用于全世界,我们日常购买的商品包装上所印的条码很多就是 EAN-13 码 ,由前缀部分、制造厂商代码、商品代码和校验码组成。条形码的应用场景极为广泛,在零售行业,收银员通过扫描商品的条形码,能快速获取商品的价格、名称等信息,完成结账流程,同时也方便商家进行库存管理;在物流行业,货物上的条形码记录了货物的发货地、目的地、订单号等信息,方便物流公司对货物进行分拣、运输和追踪。
3.2 使用ZXing.Net生成条形码
3.2.1 核心代码实现
下面是使用ZXing.Net生成条形码的 C# 代码示例:
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ZXing.Common;namespace ZXing.Net.Example
{public class BarcodeGenerator{public static Bitmap GenerateBarcode(string content, BarcodeFormat format, int width, int height, int margin){//创建BarcodeWriter对象,用于生成条形码BarcodeWriter writer = new BarcodeWriter();//设置条形码的编码格式,例如Code 128、Code 39等writer.Format = format;//设置条形码的相关参数writer.Options = new EncodingOptions{//设置条形码的宽度Width = width,//设置条形码的高度Height = height,//设置条形码的边距Margin = margin};//调用Write方法生成条形码图片,传入要编码的内容return writer.Write(content);}}
}
3.2.2 代码调用与测试
在主程序或测试方法中,可以这样调用上述生成条形码的方法:
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;namespace ZXing.Net.Example
{/// <summary>/// MainWindow.xaml 的交互逻辑/// </summary>public partial class MainWindow : Window{public MainWindow(){InitializeComponent();//要生成条形码的内容string content = "1234567890";//选择条形码格式,这里使用Code 128BarcodeFormat format = BarcodeFormat.CODE_128;//条形码宽度int width = 300;//条形码高度int height = 100;//条形码边距int margin = 10;//调用生成条形码的方法Bitmap barcodeBitmap = BarcodeGenerator.GenerateBarcode(content, format, width, height, margin);//使用System.Drawing.Common中的Image类来显示图片using (System.Drawing.Image image = barcodeBitmap){//这里可以将image保存到文件系统或者显示在界面上,以下是简单保存到文件的示例image.Save("barcode.png", System.Drawing.Imaging.ImageFormat.Png);}BitmapImage bitmapImage = BitmapToBitmapImage(barcodeBitmap);testBarcode.Source = bitmapImage;}private BitmapImage BitmapToBitmapImage(System.Drawing.Bitmap bitmap){BitmapImage bitmapImage = new BitmapImage();using (System.IO.MemoryStream ms = new System.IO.MemoryStream()){bitmap.Save(ms, ImageFormat.Png);bitmapImage.BeginInit();bitmapImage.StreamSource = ms;bitmapImage.CacheOption = BitmapCacheOption.OnLoad;bitmapImage.EndInit();bitmapImage.Freeze();}return bitmapImage;}}
}
四、生成二维码
4.1 二维码基本概念
二维码,又称二维条码,是一种用特定几何图形按黑白相间的方式在二维方向上记录数据信息的图形 。它的编码原理基于计算机的 “0” 和 “1” 比特流概念,通过黑白小方块(几何形体)来表示文字数值信息 。比如,黑色小方块代表 “1”,白色小方块代表 “0” ,这些小方块按特定规则排列,就能存储丰富的信息。
二维码具有诸多显著特点。首先是信息容量大,与一维条形码相比,它能够在有限的空间内存储更多的信息,像文本、图片、网址、文件等都能被存储。例如,火车票上的二维码就包含了车次、座位号、乘车人身份信息等大量内容 。其次,二维码纠错能力强,当二维码部分被污损、遮挡时,凭借其纠错算法,扫描设备仍能准确识别其中的信息 。一般来说,二维码的纠错等级可分为 L(7% 容错率)、M(15% 容错率)、Q(25% 容错率)、H(30% 容错率)四个等级 ,以 H 等级为例,即便有 30% 的码字损坏,也能正常解码。另外,二维码制作成本低,只需借助普通的图形处理软件和打印机,就能轻松生成和打印,而且它的识读速度快,在移动支付、信息查询等场景中,用户只需瞬间就能完成扫码操作。
常见的二维码类型有 QR Code、PDF417、Data Matrix 等 。QR Code 是目前应用最为广泛的二维码,像微信、支付宝的付款码、收款码等都采用了 QR Code 格式,它具有超高速识读的特性,很适合在工业自动化生产线管理等领域应用;PDF417 是一种堆叠式二维码,可表示数字、字母、二进制数据及汉字,信息密度高,常用于证件管理、执照年检等场景,比如一些国家的身份证、驾驶证上就使用了 PDF417 码来存储个人信息 ;Data Matrix 是一种矩阵式二维码,其突出特点是密度高,最小尺寸小,特别适用于小零件的标识,像电子元器件、精密仪器等产品上常常能看到 Data Matrix 码 。
二维码的应用场景十分广泛,在移动支付领域,人们通过扫描二维码就能快速完成支付,实现无现金交易,极大地提高了交易效率和便利性;在信息查询方面,博物馆的展品介绍、图书的相关信息等都能通过二维码来展示,用户扫描二维码即可获取详细内容;在身份识别领域,电子身份证、电子护照等都利用二维码来存储个人身份信息,方便快捷且安全可靠。
4.2 使用ZXing.Net生成二维码
4.2.1 核心代码实现
以下是使用ZXing.Net生成二维码的 C# 代码示例:
using System.Drawing;
using ZXing.Common;namespace ZXing.Net.Example
{public class QrCodeGenerator{public static Bitmap GenerateQRCode(string content, int width, int height, int margin){//创建BarcodeWriter对象,用于生成二维码BarcodeWriter writer = new BarcodeWriter();//设置二维码的编码格式为QR_CODEwriter.Format = BarcodeFormat.QR_CODE;//设置二维码的相关参数writer.Options = new EncodingOptions{//设置二维码的宽度Width = width,//设置二维码的高度Height = height,//设置二维码的边距Margin = margin};//调用Write方法生成二维码图片,传入要编码的内容return writer.Write(content);}}
}
4.2.2 代码调用与测试
在主程序或测试方法中,可以按照以下方式调用上述生成二维码的方法:
using System.Drawing;
using System.Windows;namespace ZXing.Net.Example
{/// <summary>/// MainWindow.xaml 的交互逻辑/// </summary>public partial class MainWindow : Window{public MainWindow(){InitializeComponent();//要生成二维码的内容string content = "https://www.csdn.net/";//二维码宽度int width = 200;//二维码高度int height = 200;//二维码边距int margin = 5;//调用生成二维码的方法Bitmap qrCodeBitmap = QrCodeGenerator.GenerateQRCode(content, width, height, margin);//使用System.Drawing.Common中的Image类来显示图片using (System.Drawing.Image image = qrCodeBitmap){//这里可以将image保存到文件系统或者显示在界面上,以下是简单保存到文件的示例image.Save("qrcode.png", System.Drawing.Imaging.ImageFormat.Png);}}}
}
五、生成带 Logo 的二维码
5.1 实现思路
生成带 Logo 的二维码,我们可以分两步进行。首先,利用前面介绍的方法,借助ZXing.Net库先生成一个普通的二维码图片。然后,加载事先准备好的 Logo 图片,根据二维码图片的大小,合理调整 Logo 图片的尺寸,使其能够完美地融入二维码中。最后,使用System.Drawing
命名空间下的Graphics
类,将调整好大小的 Logo 图片绘制到二维码图片的中心位置,从而得到带 Logo 的二维码图片。
5.2 代码实现
以下是生成带 Logo 二维码的完整 C# 代码:
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ZXing.Common;namespace ZXing.Net.Example
{public class QrCodeWithLogoGenerator{public static Bitmap GenerateQRCodeWithLogo(string content, int width,int height, int margin, string logoPath){//先生成普通二维码BarcodeWriter writer = new BarcodeWriter();writer.Format = BarcodeFormat.QR_CODE;writer.Options = new EncodingOptions{Width = width,Height = height,Margin = margin};//加载Logo图片Bitmap logoBitmap = new Bitmap(logoPath);//计算Logo图片在二维码中的大小和位置int logoWidth = Math.Min((int)(width * 0.2), logoBitmap.Width);int logoHeight = Math.Min((int)(height * 0.2), logoBitmap.Height);int logoX = (width - logoWidth) / 2;int logoY = (height - logoHeight) / 2;//将Logo图片绘制到二维码图片上Bitmap qrCodeBitmap = writer.Write(content);using (Graphics g = Graphics.FromImage(qrCodeBitmap)){g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;g.DrawImage(logoBitmap, new Rectangle(logoX, logoY, logoWidth, logoHeight));}return qrCodeBitmap;}}
}
在主程序或测试方法中调用该方法的示例代码如下:
using System.Drawing;
using System.Windows;namespace ZXing.Net.Example
{/// <summary>/// MainWindow.xaml 的交互逻辑/// </summary>public partial class MainWindow : Window{public MainWindow(){InitializeComponent();//要生成二维码的内容string content = "https://www.csdn.net/";//二维码宽度int width = 300;//二维码高度int height = 300;//二维码边距int margin = 10;//Logo图片路径string logoPath = "logo.png";//调用生成带Logo二维码的方法Bitmap qrCodeWithLogoBitmap = QrCodeWithLogoGenerator.GenerateQRCodeWithLogo(content, width, height, margin, logoPath);//使用System.Drawing.Common中的Image类来显示图片using (System.Drawing.Image image = qrCodeWithLogoBitmap){//这里可以将image保存到文件系统或者显示在界面上,以下是简单保存到文件的示例image.Save("qrcode_with_logo.png", System.Drawing.Imaging.ImageFormat.Png);}}}
}
width, height, margin, logoPath);
//使用System.Drawing.Common中的Image类来显示图片using (System.Drawing.Image image = qrCodeWithLogoBitmap){//这里可以将image保存到文件系统或者显示在界面上,以下是简单保存到文件的示例image.Save("qrcode_with_logo.png", System.Drawing.Imaging.ImageFormat.Png);}}
}
}
相关文章:
C#生成二维码和条形码
C# 实现二维码和条形码生成:从入门到实战 文章目录 C# 实现二维码和条形码生成:从入门到实战一、引言二、准备工作2.1 开发环境搭建2.2 引入相关库 三、生成条形码3.1 条形码基本概念3.2 使用[ZXing.Net](https://ZXing.Net)生成条形码3.2.1 核心代码实现…...

【金仓数据库征文】金仓数据库 KES:MySQL 迁移实用指南
我们都知道,现在企业数字化转型那可是势在必行,数据库迁移这事儿就变得特别关键。金仓数据库的 KingbaseES(简称 KES),就给咱从 MySQL 往 KES 迁移数据库提供了一套超好用的方案。下面咱就讲下 咋用金仓数据库来完成这…...

多态(c++详细版)
一.多态 1.1 多态的概念 多态(polymorphism)的概念:通俗来说,就是多种形态。多态分为编译时多态(静态多态)和运⾏时多态(动态多态),这⾥我们重点讲运⾏时多态,编译时多态(静态多态)和运⾏时多态(动态多态)。编译时多态(静态多态)主…...
内存泄漏系列专题分析之八:高通相机CamX内存泄漏内存占用分析--通用ION(dmabuf)内存拆解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:内存泄漏系列专题分析之七:高通相机CamX--Android通用ION(dmabuf)内存分配和释放原理 这一篇我们开始讲: 内存泄漏系列专题分析之八:高通相机CamX内存泄漏&内存占用分析--通用ION(dmabuf)内…...
后端项目进度汇报
项目概述 本项目致力于构建一个先进的智能任务自动化平台。其核心技术是一套由大型语言模型(LLM)驱动的后端系统。该系统能够模拟一个多角色协作的团队,通过一系列精心设计或动态生成的处理阶段,来高效完成各种复杂任务ÿ…...

数据结构——二叉树和堆(万字,最详细)
目录 1.树 1.1 树的概念与结构 1.2 树相关的术语 1.3 树的表示法 2.二叉树 2.1 概念与结构 2.2 特殊的二叉树 2.2.1 满二叉树 2.2.2 完全二叉树 2.3 二叉树存储结构 2.3.1 顺序结构 2.3.2 实现顺序结构二叉树 2.3.2.1 堆的概念与结构 2.3.2. 2 堆的插入与删除数据…...

MATLAB基于格拉姆角场与2DCNN-BiGRU的轴承故障诊断模型
本博客来源于CSDN机器鱼,未同意任何人转载。 更多内容,欢迎点击本专栏目录,查看更多内容。 目录 0 引言 1 格拉姆角场原理 2 2DCNN-BiGRU网络结构 3 应用实例 3.1 数据准备 3.2 格拉姆角场数据提取 3.3 网络模型搭建-重中之重 3.4 …...

正点原子IMX6U开发板移植Qt时出现乱码
移植Qt时出现乱码 1、前言2、问题3、总结 1、前言 记录一下正点原子IMX6U开发板移植Qt时出现乱码的解决方法,方便自己日后回顾,也可以给有需要的人提供帮助。 2、问题 用正点原子IMX6U开发板移植Qt时移植Qt后,sd卡里已经存储了Qt的各种库&…...

JVM局部变量表和操作数栈的内存布局
局部变量表和操作数栈 首先看一段Java源码 public class Add_Sample{public int add(int i, int j){int k 100;int result i j k;return result;}public static void main(String[] args){int result new Add_Sample().add(10,20);System.out.println(result);} }使用ja…...

Mockoon 使用教程
文章目录 一、简介二、模拟接口1、Get2、Post 一、简介 1、Mockoon 可以快速模拟API,无需远程部署,无需帐户,免费,跨平台且开源,适合离线环境。 2、支持get、post、put、delete等所有格式。 二、模拟接口 1、Get 左…...

使用 IDEA + Maven 搭建传统 Spring MVC 项目的详细步骤(非Spring Boot)
搭建Spring MVC项目 第一步:创建Maven项目第二步:配置pom.xml第三步:配置web.xml第四步:创建Spring配置文件第五步:创建控制器第六步:创建JSP视图第七步:配置Tomcat并运行目录结构常见问题解决与…...
以下是在 Ubuntu 上的几款PDF 阅读器,涵盖轻量级、功能丰富和特色工具:
默认工具:Evince(GNOME 文档查看器) 特点:Ubuntu 预装,轻量快速,支持基本标注和书签。 安装:已预装,或手动安装: sudo apt install evince功能全面:Okular&…...

3.2.3 掌握RDD转换算子 - 4. 按键归约算子 - reduceByKey()
在本节课中,我们深入学习了Spark RDD的reduceByKey()算子。reduceByKey()主要用于处理元素为(key, value)形式的RDD,能够将相同key的元素聚集并合并,最终返回一个新RDD,其元素类型与原RDD保持一致。通过案例演示,我们首…...
AI领域的MCP(Model-Centric Paradigm)
1. 什么是MCP(Model-Centric Paradigm)? MCP(Model-Centric Paradigm)是人工智能开发中的一种核心理念,强调以模型的优化与改进作为主要驱动因素来提升AI系统的表现。在MCP模式下,开发者专注于…...

Pandas比MySQL快?
知乎上有人问,处理百万级数据,Python列表、Pandas、Mysql哪个更快? Pands是Python中非常流行的数据处理库,拥有大量用户,所以拿它和Mysql对比也是情理之中。 实测来看,MySQL > Pandas > Python列表…...
模拟内存管理
文章目录 1. 实验六:内存管理2. 记录内存空间使用情况2.1 全局参数2.2 内存空间相关参数2.3 关键结构体定义2.4 内存系统初始化 3. 记录空闲分区3.1 采用位图的方式记录物理内存中的空闲帧3.1.1 记录方式3.1.2 举例分析 3.2 主要操作3.2.1 初始化空闲帧:…...
大模型调优方法与注意事项
大模型调优(Fine-tuning)是指对预训练的大型语言模型(如GPT、BERT、LLaMA等)进行二次训练,使其适应特定任务或领域的过程。以下是调优的关键步骤、方法和注意事项: 一、调优的核心步骤 任务定义与数据准备 …...

简易的考试系统设计(Web实验)
简易的考试系统设计(Web实验) 1.实验内容与设计思想(一)实验需求(二)设计思路 2.代码展示3.实验小结 1.实验内容与设计思想 (一)实验需求 1.编写两个页面程序,一个HTML…...
【嵌入式开发-SDIO】
嵌入式开发--SDIO ■ SDIO-简介■■■■■ ■ SDIO-简介 SDIO(Secure Digital Input and Output),即安全数字输入输出接口。它是在SD卡接口的基础上发展而来,它可以兼容之前的SD卡,并可以连接SDIO接口设备,比如:蓝牙、…...

基于Kubernetes的Apache Pulsar云原生架构解析与集群部署指南(上)
#作者:闫乾苓 文章目录 概念和架构概述主要特点消息传递核心概念Pulsar 的消息模型Pulsar 的消息存储与分发Pulsar 的高级特性架构BrokerBookKeeperZooKeeper 概念和架构 概述 Pulsar 是一个多租户、高性能的服务器到服务器消息传递解决方案。Pulsar 最初由雅虎开…...
车载网络TOP20核心概念科普
一、基础协议与总线技术 CAN总线 定义:控制器局域网,采用差分信号传输,速率最高1Mbps,适用于实时控制(如动力系统)。形象比喻:如同“神经系统”,负责传递关键控制信号。 LIN总线 定…...

使用JAVA对接Deepseek API实现首次访问和提问
一、标题 参考:https://www.cnblogs.com/saoge/p/18866776 使用JAVA对接Deepseek API实现首次访问和 提问:我有50万能做什么小本生意,举例3个! 二、代码 import java.io.BufferedReader; import java.io.InputStreamReader; import java.…...

【C语言】文件操作(续)
目录 复习: 一⽂件的顺序读写 例子: 前言: 在上篇文章中介绍了文件的类型,文件指针,流,操作的函数。 在本篇文章继续为大家带来文件细节分享,如 顺序读写等等。 复习: fopen是…...

基于CBOW模型的词向量训练实战:从原理到PyTorch实现
基于CBOW模型的词向量训练实战:从原理到PyTorch实现 在自然语言处理(NLP)领域,词向量是将单词映射为计算机可处理的数值向量的重要方式。通过词向量,单词之间的语义关系能够以数学形式表达,为后续的文本分…...

mac连接lniux服务器教学笔记
从你的检查结果看,容器内已经安装了 XFCE 桌面环境(xfce.desktop 和 xubuntu.desktop 的存在说明桌面环境已存在)。以下是针对 Docker 容器环境的远程桌面配置方案: 一、容器内快速配置远程桌面(XFCE VNC)…...
vue3 - keepAlive缓存组件
在Vue 3中,<keep-alive>组件用于缓存动态组件或路由组件的状态,避免重复渲染,提升性能。 我们新建两个组件,在每一个组件里面写一个input,在默认情况下当组件切换的时候,数据会被清空,但…...

阀门产业发展方向报告(石油化工阀门应用技术交流大会)
本文大部分内容来自中国通用机械工业协会副会长张宗列在“2024全国石油化工阀门应用技术交流大会”上发表的报告。 一、国外阀门产业发展 从全球阀门市场分布看,亚洲是最大的工业阀门市场,美洲是全球第二大工业阀门市场,欧洲位列第三。 从国…...

Windows Server 2025 安装AMD显卡驱动
运行显卡驱动安装程序,会提示出问题。但是此时资源已经解压 来到驱动路径 C:\AMD\AMD-Software-Installer\Packages\Drivers\Display\WT6A_INF 打开配置文件,把这两行替换掉 %ATI% ATI.Mfg, NTamd64.10.0...16299, NTamd64.10.0, NTamd64.6.0, NTamd64.…...

用 CodyBuddy 帮我写自动化运维脚本
我正在参加CodeBuddy「首席试玩官」内容创作大赛,本文所使用的 CodeBuddy 免费下载链接:腾讯云代码助手 CodeBuddy - AI 时代的智能编程伙伴”。 #CodeBuddy首席试玩官 背景 我个人是非常喜欢 Jenkins 自动化部署工具的,之前都是手写 Jenki…...
从单体到微服务:基于 ABP vNext 模块化设计的演进之路
🚀 从单体到微服务:基于 ABP vNext 模块化设计的演进之路 🧩 引言 在需求多变且性能压力日益增大的背景下,传统单体应用在部署、维护和扩展方面存在显著挑战。 ABP vNext 作为基于 ASP.NET Core 的框架,自带模块化设…...