C# 实现二维码和条形码生成:从入门到实战
文章目录
- [C# 实现二维码和条形码生成:从入门到实战](# 实现二维码和条形码生成:从入门到实战)
-
- 一、引言
- 二、准备工作
-
- [2.1 开发环境搭建](#2.1 开发环境搭建)
- [2.2 引入相关库](#2.2 引入相关库)
- 三、生成条形码
-
- [3.1 条形码基本概念](#3.1 条形码基本概念)
- [3.2 使用[ZXing.Net](https://ZXing.Net)生成条形码](#3.2 使用ZXing.Net生成条形码)
-
- [3.2.1 核心代码实现](#3.2.1 核心代码实现)
- [3.2.2 代码调用与测试](#3.2.2 代码调用与测试)
- 四、生成二维码
-
- [4.1 二维码基本概念](#4.1 二维码基本概念)
- [4.2 使用[ZXing.Net](https://ZXing.Net)生成二维码](#4.2 使用ZXing.Net生成二维码)
-
- [4.2.1 核心代码实现](#4.2.1 核心代码实现)
- [4.2.2 代码调用与测试](#4.2.2 代码调用与测试)
- [五、生成带 Logo 的二维码](#五、生成带 Logo 的二维码)
-
- [5.1 实现思路](#5.1 实现思路)
- [5.2 代码实现](#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# 代码示例:
csharp
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 代码调用与测试
在主程序或测试方法中,可以这样调用上述生成条形码的方法:
csharp
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 128
BarcodeFormat 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# 代码示例:
csharp
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_CODE
writer.Format = BarcodeFormat.QR_CODE;
//设置二维码的相关参数
writer.Options = new EncodingOptions
{
//设置二维码的宽度
Width = width,
//设置二维码的高度
Height = height,
//设置二维码的边距
Margin = margin
};
//调用Write方法生成二维码图片,传入要编码的内容
return writer.Write(content);
}
}
}
4.2.2 代码调用与测试
在主程序或测试方法中,可以按照以下方式调用上述生成二维码的方法:
csharp
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# 代码:
csharp
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;
}
}
}
在主程序或测试方法中调用该方法的示例代码如下:
csharp
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);
}
}
}
}