使用 ZXing.NET 创建您自己的二维码





5.00/5 (2投票s)
使用 C# 创建二维码非常简单,不需要太多代码。您只需要合适的 nuGet 包。
引言
无论走到哪里,您都能看到二维码。我甚至在澳大利亚的一家餐厅里,在餐桌上看到了它们。这个想法很棒:用手机扫描二维码,您就可以进入在线菜单。在那里您可以点餐、付款,然后等待食物。
也许您和我都一样,认为二维码是理所当然的。但您是否曾了解过二维码代表什么,或者它到底是什么?嗯… 我知道了!
二维码(Quick Response code,快速响应码)是一种二维条形码,可以用智能手机摄像头或二维码扫描器进行扫描。二维码可以存储大量信息,包括网站 URL、联系信息、产品详情等等。
二维码由白色背景上的黑白方块组成,这些方块以网格状排列。编码在二维码中的信息存储在方块的图案中,可以使用智能手机上的二维码阅读器应用程序或专用扫描器进行解码。
您可以在很多地方找到二维码,包括广告、营销、票务和库存管理等。它们之所以流行,是因为它们易于创建和使用,并且可以使用智能手机摄像头快速准确地读取。
本文将力求简洁明了,因为主题是二维码,而不是如何构建一个过于复杂的 WinForms 或 WPF 应用程序,该应用程序需要大量时间和代码才能向您展示 15 行二维码示例代码。
在本教程中,我将使用一个包含生成和读取二维码代码的控制台应用程序。如何使用它取决于您。您可以轻松地复制这些代码并将其实现到您自己的应用程序中。无论您的应用程序是 API、WPF、MAUI、Blazor,还是您想要的任何其他类型,它都能正常工作。
ZXing.NET
虽然您可以从头开始编写二维码生成器,但这将是完全浪费时间。为什么要重复造轮子呢?这使得我们作为开发者的生活更加轻松:大多数事情都已经发明出来了。
有许多库可用于生成和读取二维码。我真的很难找到一个既能做到这两点的库。它们确实存在,但需要付费或过于复杂。
ZXing.NET 是一个开源包,允许您生成和读取二维码。这就是我们将在本教程中使用的包。这个想法很简单:创建一个表示二维码的图像。代码中包含一些文本。然后我们想读取这个二维码,并将文本写在控制台中。
很简单,对吧?开始吧!
入门
让我们开始创建一个简单的控制台应用程序。我将使用 .NET 7,但您也可以使用 .NET 8 或 6。
创建控制台应用程序后,您可以安装 ZXing.NET 包。请注意,他们已将不同的目标分离到不同的包中。如果您想为 Android 使用 ZXing,您需要一个不同于针对 Windows 计算机的 NuGet 包。
我将使用 Windows 计算机,所以我安装了以下包
Install-Package ZXing.Net
Install-Package ZXing.Net.Bindings.Windows.Compatibility
就是这样!现在我们可以编写代码来生成二维码了。
生成二维码
在我们可以读取二维码之前,我们需要先创建它(废话)。由于我们使用的是 ZXing.NET,因此生成包含文本的二维码非常容易。
我们需要做的第一件事是确定二维码图像的保存位置。然后我们创建一些生成二维码所需的选项。之后,我们定义一个需要知道要创建的格式(二维码)的编写器。最后,我们将文本插入编写器并保存位图。
如果将上一段翻译成代码,它看起来是这样的
string imageFileName = "klc_qr_code.png";
QrCodeEncodingOptions options = new() {
DisableECI = true,
CharacterSet = "UTF-8",
Width = 500,
Height = 500
};
BarcodeWriter writer = new() {
Format = BarcodeFormat.QR_CODE,
Options = options
};
Bitmap qrCodeBitmap = writer.Write("This is my QR code!");
qrCodeBitmap.Save(imageFileName);
让我们从头开始逐步讲解。首先,我定义了图像文件。我没有添加路径,所以这个文件将保存在与调试应用程序相同的目录中(您的项目路径/bin/Debug/net7.0)。
接下来是 QrCodeEndodingOptions
,这是二维码的设置。我认为大多数选项都很清楚,除了 DisableECI
。ECI 是二维码的一种规范,但有些阅读器在读取带有此规范的二维码时会遇到困难。所以最好禁用它… 为什么不默认禁用它呢?只是说说而已。
总之,接下来是 BarcodeWriter
。当我第一次尝试这段代码时,我还在想:“Barcode… Writer?” ZXing 不仅兼容二维码的创建,还兼容条形码和其他类型的创建。很酷,不是吗?
Format 属性是您设置要创建的图形类型的地方。我将其设置为 QR_CODE
,但请随意探索其他选项。
然后我们将文本写入编写器并将其放入位图中。在示例中,我放入了“This is my QR code”,但您可以随意添加任何您想要的内容。
就是这样!您可以执行此代码并找到图像。用手机扫描它,看看会发生什么!
读取二维码
接下来:读取二维码。您可以使用刚刚制作的二维码,使用上面图片中的我的二维码,或者互联网上找到的任何随机二维码。
首先,我们需要设置一些选项。在这里,我们定义了我们要设置的选项类型。由于 ZXing 不仅仅能处理二维码,我们将其设置为二维码。然后我们将初始化一个包含我们要读取的二维码的位图。接下来是初始化一个可以解码位图为结果的新读取器。结果包含文本。简单!
让我们看看代码
DecodingOptions readOptions = new() {
PossibleFormats = new List<BarcodeFormat> { BarcodeFormat.QR_CODE },
TryHarder = true
};
Bitmap readQRCodeBitmap = new(imageFileName);
BarcodeReader reader = new() {
Options = readOptions
};
Result qrCodeResult = reader.Decode(readQRCodeBitmap);
if (qrCodeResult != null)
Console.WriteLine(qrCodeResult.Text);
如前所述,我们从选项开始,它是 DecodingOptions
类型。我已将 PossibleFormats
属性设置为 BarcodeFormat.QR_CODE
。如果您想尝试其他类型,请随时这样做。
我必须说,我对着 TryHarder
属性笑了。它基本上意味着当设置为尝试时,它会更深入地研究位图。
接下来是创建位图,它从磁盘读取二维码并将其转换为位图。
之后,我们初始化 BarcodeReader
并将选项添加到其中。此读取器将在下一行解码位图,将 result
放入变量 qrCodeResult
中。
现在我们可以从读取器中获取文本并将其显示在控制台应用程序中。
其他选项
虽然文本很酷,但我们也可以将其他类型的信息添加到二维码中。如果您输入电子邮件地址而不是文本,您的手机扫描该二维码后,会提示您向该电子邮件地址发送电子邮件。
如果您在二维码中输入电话号码,您的手机会允许您直接拨打该号码。但要小心。一个数字出错,人们就会拨打错误的人的电话。
但是,您也可以将您的整个联系信息写入二维码。当有人扫描它时,他/她可以将该联系信息保存在手机中。这可以通过“MECARD
”完成。这与之前的代码完全相同,只是需要编写更多信息到二维码中
string imageFileName = "klc_qr_code.png";
QrCodeEncodingOptions options = new() {
DisableECI = true,
CharacterSet = "UTF-8",
Width = 500,
Height = 500
};
BarcodeWriter writer = new() {
Format = BarcodeFormat.QR_CODE,
Options = options
};
var contactInfo = new StringBuilder();
contactInfo.Append("MECARD:");
contactInfo.Append("N:Elzerman,Kenji;");
contactInfo.Append("TEL:123456789;");
contactInfo.Append("EMAIL:kenji.elzerman@kenslearningcurve.com;");
contactInfo.Append("ADR:123 Main St., Anytown, USA;");
contactInfo.Append("NOTE:Phonenumber and address are fake!");
Bitmap qrCodeBitmap = writer.Write(contactInfo.ToString());
qrCodeBitmap.Save(imageFileName);
关于如何使用二维码,还有更多想法。整个寻宝游戏都是基于二维码设计的。您甚至可以将小图像保存在二维码中。不知道为什么您应该这样做,但您可以!
结论
创建和读取二维码非常简单。只需使用正确的库,您就可以创建一个二维码并与朋友、家人、同事或任何人共享。您可以使用它将人们导向您的网站或共享联系信息,而不会出现输入错误的机会… 如果您真的犯了错误。
有很多库可以完成我在本教程中向您展示的相同的技巧,但我发现 ZXing 库非常容易使用。此外,您不仅可以生成二维码,还可以读取它们。
历史
- 2023年3月30日:初版