QR Code .NET Core:使用 C# 读取和生成二维码
在使用 .NET Core 构建 Web 或 Enterprise 应用程序时,对 QR 码的支持(用于库存跟踪、支付流程或双因素认证)往往是常见的需求。 与其将开发周期耗费在低级编码算法上,不如选用能够处理完整工作流的专用库。 IronQR for .NET 提供完整的 QR 代码解决方案,涵盖从基础生成到基于机器学习的读取以及高级纠错等所有功能。
准备亲自尝试一下了吗? 立即开始免费试用,体验如何快速为您的项目添加QR功能。
如何安装QR库?
通过 NuGet 安装 IronQR 只需几秒钟。 打开 Visual Studio,转到"工具">"NuGet 程序包管理器">"管理解决方案的 NuGet 程序包" ,搜索 IronQR,然后单击"安装" 。 该软件包依赖项极少,开箱即用,支持 Windows、macOS 和 Linux 系统。
Install-Package IronQR
IronQR 支持 .NET Core 6、7、8、9 和 10,以及 .NET Framework 4.6.2 及更高版本。 对于跨平台项目,SkiaSharp 集成可在非 Windows 运行时环境中处理图像。 该库可与 ASP.NET Core Web 应用程序、控制台应用程序和桌面解决方案配合使用,无需额外的运行时配置。 安装完成后,所有必要的扩展方法和类型均可立即使用。
如何从图片中读取一个基本的QR码?
从图像文件中读取QR数据只需几行代码。 QrReader 类使用先进的机器学习模型来评估图像质量并自动选择正确的分割模式,即使输入图像不理想,也能提供准确的结果。
using IronQr;
using IronSoftware.Drawing;
// Load image containing QR code
var inputBmp = AnyBitmap.FromFile("qr-sample.png");
// Create QrImageInput from the bitmap
QrImageInput imageInput = new QrImageInput(inputBmp);
// Initialize QR Reader with ML model
QrReader reader = new QrReader();
// Read and decode all QR codes in the image
IEnumerable<QrResult> results = reader.Read(imageInput);
// Output decoded text strings
foreach (var qrCode in results)
{
Console.WriteLine($"QR Code Value: {qrCode.Value}");
Console.WriteLine($"URL: {qrCode.Url}");
}
using IronQr;
using IronSoftware.Drawing;
// Load image containing QR code
var inputBmp = AnyBitmap.FromFile("qr-sample.png");
// Create QrImageInput from the bitmap
QrImageInput imageInput = new QrImageInput(inputBmp);
// Initialize QR Reader with ML model
QrReader reader = new QrReader();
// Read and decode all QR codes in the image
IEnumerable<QrResult> results = reader.Read(imageInput);
// Output decoded text strings
foreach (var qrCode in results)
{
Console.WriteLine($"QR Code Value: {qrCode.Value}");
Console.WriteLine($"URL: {qrCode.Url}");
}
Imports IronQr
Imports IronSoftware.Drawing
' Load image containing QR code
Dim inputBmp = AnyBitmap.FromFile("qr-sample.png")
' Create QrImageInput from the bitmap
Dim imageInput As New QrImageInput(inputBmp)
' Initialize QR Reader with ML model
Dim reader As New QrReader()
' Read and decode all QR codes in the image
Dim results As IEnumerable(Of QrResult) = reader.Read(imageInput)
' Output decoded text strings
For Each qrCode In results
Console.WriteLine($"QR Code Value: {qrCode.Value}")
Console.WriteLine($"URL: {qrCode.Url}")
Next
输入二维码
!a href="/static-assets/qr/blog/qr-code-dotnet-core/qr-code-dotnet-core-1.webp">QR 代码生成器 .NET Core:只需几行代码即可读取和生成 QR 代码:图片 1 - 输入 QR 代码。
输出
!a href="/static-assets/qr/blog/qr-code-dotnet-core/qr-code-dotnet-core-2.webp">QR 代码生成器 .NET Core:只需几行代码即可读取和生成 QR 代码:图片 2 - QR 代码扫描输出示例。
QrReader.Read() 方法处理 QrImageInput 并返回 IEnumerable<QrResult>,其中每个结果都包含解码后的文本、编码后的 URL 以及图像中 QR 符号的空间位置。 该库接受字节数组、文件路径和对象,让您可以灵活地适应任何项目架构——无论您是从磁盘、数据库还是实时摄像头流读取数据。
支撑该读取器的机器学习模型,使 IronQR 区别于纯粹的算法库。 它能够处理运动模糊、部分遮挡和光照不均等现实场景中的缺陷,且无需手动预处理或阈值调整。
如何提取高级QR码数据?
除了基本的值解码外,IronQR 还能从每个扫描的符号中提取坐标、原始数据段以及模块级信息。 这对于文档处理工作流至关重要——在这些场景中,您需要精确定位页面上QR码的位置;对于必须处理单张图片中多个QR码的应用程序,这一点同样不可或缺。
using IronQr;
using IronSoftware.Drawing;
var inputBmp = AnyBitmap.FromFile("document-with-qr.png");
QrImageInput imageInput = new QrImageInput(inputBmp);
QrReader reader = new QrReader();
IEnumerable<QrResult> results = reader.Read(imageInput);
foreach (var qrCode in results)
{
// Access decoded value
Console.WriteLine($"Data: {qrCode.Value}");
// Get corner coordinate positions
foreach (PointF point in qrCode.Points)
{
Console.WriteLine($"Position: {point.X}, {point.Y}");
}
}
using IronQr;
using IronSoftware.Drawing;
var inputBmp = AnyBitmap.FromFile("document-with-qr.png");
QrImageInput imageInput = new QrImageInput(inputBmp);
QrReader reader = new QrReader();
IEnumerable<QrResult> results = reader.Read(imageInput);
foreach (var qrCode in results)
{
// Access decoded value
Console.WriteLine($"Data: {qrCode.Value}");
// Get corner coordinate positions
foreach (PointF point in qrCode.Points)
{
Console.WriteLine($"Position: {point.X}, {point.Y}");
}
}
Imports IronQr
Imports IronSoftware.Drawing
Dim inputBmp = AnyBitmap.FromFile("document-with-qr.png")
Dim imageInput As New QrImageInput(inputBmp)
Dim reader As New QrReader()
Dim results As IEnumerable(Of QrResult) = reader.Read(imageInput)
For Each qrCode In results
' Access decoded value
Console.WriteLine($"Data: {qrCode.Value}")
' Get corner coordinate positions
For Each point As PointF In qrCode.Points
Console.WriteLine($"Position: {point.X}, {point.Y}")
Next
Next
输入 QR.
!a href="/static-assets/qr/blog/qr-code-dotnet-core/qr-code-dotnet-core-3.webp">QR 代码生成器 .NET Core:只需几行代码即可读取和生成 QR 代码:图片 3 - 输入 QR 代码。
高级 QR 阅读结果
!a href="/static-assets/qr/blog/qr-code-dotnet-core/qr-code-dotnet-core-4.webp">QR 代码生成器 .NET Core:只需几行代码即可读取和生成 QR 代码:图像 4 - 高级 QR 数据提取的结果
QrResult.Points 集合包含检测到的 QR 符号在像素空间中的四个角坐标。 您的应用程序可利用这些功能在文档图像上叠加边界框、裁剪QR区域以供后续处理,或将位置数据传递给下游系统,由该系统将物理坐标映射到文档的逻辑位置。
IronQR 通过同一个机器学习流程处理包含自定义嵌入式徽标、损坏模块或低分辨率输入的二维码。该库不需要单独的预处理步骤——检测和解码只需一次 Read() 调用即可完成。
纠错级别如何影响QR码质量?
纠错机制使QR扫描仪即使在部分代码被遮挡、打印质量不佳或物理损坏的情况下,也能恢复原始数据。 QR标准定义了四个等级——低(L)、中(M)、四分位(Q)和高(H)——每个等级都在存储容量与抗损能力之间进行权衡。
| 级别 | 恢复能力 | 最佳用途 |
|---|---|---|
| L | ~7% | 清晰的数字显示,最高的数据密度 |
| M | ~15% | 通用打印应用程序 |
| 问 | ~25% | 工业标签,预计磨损程度中等 |
| H | ~30% | 嵌入式标识、户外或高磨损表面 |
生成QR码时,指定更高的纠错级别可确保输出结果在实际扫描条件下依然有效:
using IronQr;
using IronSoftware.Drawing;
// Configure QR options with high error correction
var qrOptions = new QrOptions(QrErrorCorrectionLevel.High, 20);
// Generate a QR code with specified error correction
QrCode myQr = QrWriter.Write("https://ironsoftware.com", qrOptions);
// Save as PNG image
AnyBitmap qrImage = myQr.Save();
qrImage.SaveAs("high-error-correction-qr.png");
using IronQr;
using IronSoftware.Drawing;
// Configure QR options with high error correction
var qrOptions = new QrOptions(QrErrorCorrectionLevel.High, 20);
// Generate a QR code with specified error correction
QrCode myQr = QrWriter.Write("https://ironsoftware.com", qrOptions);
// Save as PNG image
AnyBitmap qrImage = myQr.Save();
qrImage.SaveAs("high-error-correction-qr.png");
IRON VB CONVERTER ERROR developers@ironsoftware.com
输出
!a href="/static-assets/qr/blog/qr-code-dotnet-core/qr-code-dotnet-core-5.webp">QR 代码生成器 .NET Core:只需几行代码即可读取和生成 QR 代码:图片 5 - 生成的 QR 代码具有较高的纠错水平。
QrOptions 构造函数接受错误纠正级别和最大版本号。 版本 40 的编码可存储多达 7,089 个数字字符,而版本 1 的编码仅能存储 41 个。设置较低的最大版本可限制输出大小,这在需要确保整批产品物理尺寸一致时非常有用。 错误校正级别越高,用于冗余的模块就越多,从而在任何给定版本中都会减少净数据容量。
IronQR 的容错功能与该特性相辅相成——在读取高纠错级别生成的条码时,IronQR库能够从那些仅靠纯算法解码器会完全读取失败的条码中恢复数据。
如何生成包含国际字符的QR码?
IronQR 支持全套 QR 编码模式:数字、字母数字、字节和汉字。 对于日语文本和其他 Unicode 内容,该库会自动选择空间利用率最高的编码:
using IronQr;
using IronSoftware.Drawing;
// Generate QR that encodes Japanese Unicode text
QrCode japaneseQr = QrWriter.Write("こんにちは世界");
// The library selects Kanji mode automatically
AnyBitmap qrImage = japaneseQr.Save();
qrImage.SaveAs("japanese-qr.png");
using IronQr;
using IronSoftware.Drawing;
// Generate QR that encodes Japanese Unicode text
QrCode japaneseQr = QrWriter.Write("こんにちは世界");
// The library selects Kanji mode automatically
AnyBitmap qrImage = japaneseQr.Save();
qrImage.SaveAs("japanese-qr.png");
Imports IronQr
Imports IronSoftware.Drawing
' Generate QR that encodes Japanese Unicode text
Dim japaneseQr As QrCode = QrWriter.Write("こんにちは世界")
' The library selects Kanji mode automatically
Dim qrImage As AnyBitmap = japaneseQr.Save()
qrImage.SaveAs("japanese-qr.png")
QR 代码输出
!a href="/static-assets/qr/blog/qr-code-dotnet-core/qr-code-dotnet-core-6.webp">QR 代码生成器 .NET Core:只需几行代码即可读取和生成 QR 代码:图片 6 - 输出 QR 代码。
汉字编码采用每模块两个字节而非八位字节的编码方式,因此相同版本的日语 QR 码所能存储的字符数量远多于等效的 UTF-8 字节模式 QR 码。 对于混合内容(例如 URL 后跟日文文本),IronQR 会将输入内容分割,并以最优模式对每个片段进行编码。 您无需手动指定分段边界或调用编码辅助函数; 编码管道会为您处理此事。
此自动选择功能还涵盖扩展通道解释 (ECI) 标记,这些标记会向扫描仪提示正在使用非标准字符集。 面向国际市场的应用程序可以直接将任何 Unicode 字符串传递给 QrWriter.Write(),而无需单独配置。
如何使用有效载荷生成器处理结构化 QR 码数据?
仅编码普通 URL 的 QR 码适用于简单的链接分享,但许多应用需要编码结构化数据——例如 Wi-Fi 凭据、vCard 格式的名片或活动数据。 手动格式化这些内容容易出错; 缺少分号或字段顺序错误会导致扫描仪误解数据。
IronQR 提供了用于正确构建这些结构化字符串的负载助手:
using IronQr;
using IronSoftware.Drawing;
// Generate QR code with URL payload
var urlQrCode = QrWriter.Write("https://ironsoftware.com/csharp/qr/");
// Save QR as PNG image file
AnyBitmap qrImage = urlQrCode.Save();
qrImage.SaveAs("url-qr-code.png");
Console.WriteLine("QR code generated successfully.");
using IronQr;
using IronSoftware.Drawing;
// Generate QR code with URL payload
var urlQrCode = QrWriter.Write("https://ironsoftware.com/csharp/qr/");
// Save QR as PNG image file
AnyBitmap qrImage = urlQrCode.Save();
qrImage.SaveAs("url-qr-code.png");
Console.WriteLine("QR code generated successfully.");
Imports IronQr
Imports IronSoftware.Drawing
' Generate QR code with URL payload
Dim urlQrCode = QrWriter.Write("https://ironsoftware.com/csharp/qr/")
' Save QR as PNG image file
Dim qrImage As AnyBitmap = urlQrCode.Save()
qrImage.SaveAs("url-qr-code.png")
Console.WriteLine("QR code generated successfully.")
创建的 QR 代码
!a href="/static-assets/qr/blog/qr-code-dotnet-core/qr-code-dotnet-core-7.webp">QR 代码生成器 .NET Core:只需几行代码即可读取和生成 QR 代码:图片 7 - 从 URL 创建的 QR 代码。
QrWriter.Write() 方法接受纯字符串或结构化有效负载对象。 对于 Wi-Fi 网络,有效载荷将 SSID、密码和安全类型编码为 Android 和 iOS 扫描器可识别的格式。对于联系信息,输出遵循大多数移动端 QR 阅读器采用的 MeCard 标准。 "生成"功能页面详细记录了所有受支持的负载类型及其必填字段。
该库可输出像素尺寸可配置的图像。 用于实际生产环境时,生成至少 200x200 像素的代码,可确保在典型智能手机扫描距离下实现可靠识别。 较大尺寸适用于扫描距离超过一米的户外或PRINT应用场景。
如何自定义QR码的外观?
IronQR 让您能够控制生成的二维码外观,同时不影响其可扫描性。 您可以更改前景色和背景色,应用自定义品牌标识,或将徽标嵌入中央的留白区域。
using IronQr;
using IronSoftware.Drawing;
// Define custom colors for the QR code
var darkColor = Color.FromArgb(30, 30, 120); // Deep navy foreground
var lightColor = Color.White;
var options = new QrOptions(QrErrorCorrectionLevel.High, maxVersion: 20)
{
BackgroundColor = lightColor,
Color = darkColor,
// Embed a logo image into the QR center
Logo = AnyBitmap.FromFile("logo.png")
};
QrCode styledQr = QrWriter.Write("https://ironsoftware.com/csharp/qr/", options);
AnyBitmap output = styledQr.Save();
output.SaveAs("branded-qr.png");
using IronQr;
using IronSoftware.Drawing;
// Define custom colors for the QR code
var darkColor = Color.FromArgb(30, 30, 120); // Deep navy foreground
var lightColor = Color.White;
var options = new QrOptions(QrErrorCorrectionLevel.High, maxVersion: 20)
{
BackgroundColor = lightColor,
Color = darkColor,
// Embed a logo image into the QR center
Logo = AnyBitmap.FromFile("logo.png")
};
QrCode styledQr = QrWriter.Write("https://ironsoftware.com/csharp/qr/", options);
AnyBitmap output = styledQr.Save();
output.SaveAs("branded-qr.png");
Imports IronQr
Imports IronSoftware.Drawing
' Define custom colors for the QR code
Dim darkColor As Color = Color.FromArgb(30, 30, 120) ' Deep navy foreground
Dim lightColor As Color = Color.White
Dim options As New QrOptions(QrErrorCorrectionLevel.High, maxVersion:=20) With {
.BackgroundColor = lightColor,
.Color = darkColor,
' Embed a logo image into the QR center
.Logo = AnyBitmap.FromFile("logo.png")
}
Dim styledQr As QrCode = QrWriter.Write("https://ironsoftware.com/csharp/qr/", options)
Dim output As AnyBitmap = styledQr.Save()
output.SaveAs("branded-qr.png")
嵌入徽标会减少有效数据区域,因此当提供徽标时,该库需要 H 级错误校正。 中心区域预留的静区约占代码表面的 30%,该比例在 H 级别的恢复能力范围内。 该库会自动执行此限制——若在添加徽标时设置了较低的错误纠正级别,IronQR会抛出带有描述性信息的异常,而非生成无法可靠扫描的二维码。
对于 ASP.NET Core 应用程序,.NET Core QR 生成器教程演示了如何通过控制器操作将生成的 QR 码作为图像响应返回。 输出流会直接写入响应,无需中间文件 I/O 操作,从而为高流量端点保持低延迟。
如何在 ASP.NET Core 应用程序中读取 QR 码?
在服务器端扫描 QR 码——无论是通过上传的图像、文档处理管道还是自动化检测系统——是读取 API 的常见应用场景。 ASP.NET QR 扫描器指南涵盖了完整的控制器和服务配置,但其核心读取模式与控制台应用程序相同:
using IronQr;
using IronSoftware.Drawing;
using Microsoft.AspNetCore.Mvc;
[ApiController]
[Route("api/qr")]
public class QrScanController : ControllerBase
{
[HttpPost("scan")]
public IActionResult Scan(IFormFile imageFile)
{
using var stream = imageFile.OpenReadStream();
var bitmap = AnyBitmap.FromStream(stream);
var imageInput = new QrImageInput(bitmap);
var reader = new QrReader();
var results = reader.Read(imageInput);
var decoded = results.Select(r => new { r.Value, r.Url }).ToList();
return Ok(decoded);
}
}
using IronQr;
using IronSoftware.Drawing;
using Microsoft.AspNetCore.Mvc;
[ApiController]
[Route("api/qr")]
public class QrScanController : ControllerBase
{
[HttpPost("scan")]
public IActionResult Scan(IFormFile imageFile)
{
using var stream = imageFile.OpenReadStream();
var bitmap = AnyBitmap.FromStream(stream);
var imageInput = new QrImageInput(bitmap);
var reader = new QrReader();
var results = reader.Read(imageInput);
var decoded = results.Select(r => new { r.Value, r.Url }).ToList();
return Ok(decoded);
}
}
Imports IronQr
Imports IronSoftware.Drawing
Imports Microsoft.AspNetCore.Mvc
<ApiController>
<Route("api/qr")>
Public Class QrScanController
Inherits ControllerBase
<HttpPost("scan")>
Public Function Scan(imageFile As IFormFile) As IActionResult
Using stream = imageFile.OpenReadStream()
Dim bitmap = AnyBitmap.FromStream(stream)
Dim imageInput = New QrImageInput(bitmap)
Dim reader = New QrReader()
Dim results = reader.Read(imageInput)
Dim decoded = results.Select(Function(r) New With {Key .Value = r.Value, Key .Url = r.Url}).ToList()
Return Ok(decoded)
End Using
End Function
End Class
AnyBitmap.FromStream() 方法接受任何可读流,因此相同的代码路径适用于通过表单上传的文件、从 Blob 存储中获取的图像或从视频管道中提取的帧。控制器不会将任何临时文件写入磁盘,这对于文件系统可能为只读的容器化部署至关重要。
对于高吞吐量场景,请将 QrReader 作为单例在每个应用程序生命周期内实例化一次,因为 ML 模型加载成本是在首次构造时支付的。 同一实例上的后续 Read() 调用是线程安全的,并且共享已加载的模型。
如何在 .NET MAUI 应用程序中生成 QR 码?
.NET MAUI QR 教程演示了在 iOS、Android、macOS 和 Windows 平台上的完整跨平台生成功能。 IronQR 在非 Windows 平台上运行时使用 SkiaSharp 渲染后端,从而在所有 MAUI 目标平台上提供一致的输出效果。
using IronQr;
using IronSoftware.Drawing;
// Generate QR and convert to a byte array for display in MAUI
QrCode qr = QrWriter.Write("https://ironsoftware.com/csharp/qr/");
AnyBitmap bitmap = qr.Save();
byte[] imageBytes = bitmap.ExportBytes();
// Bind imageBytes to an <Image Source> in your MAUI page
using IronQr;
using IronSoftware.Drawing;
// Generate QR and convert to a byte array for display in MAUI
QrCode qr = QrWriter.Write("https://ironsoftware.com/csharp/qr/");
AnyBitmap bitmap = qr.Save();
byte[] imageBytes = bitmap.ExportBytes();
// Bind imageBytes to an <Image Source> in your MAUI page
Imports IronQr
Imports IronSoftware.Drawing
' Generate QR and convert to a byte array for display in MAUI
Dim qr As QrCode = QrWriter.Write("https://ironsoftware.com/csharp/qr/")
Dim bitmap As AnyBitmap = qr.Save()
Dim imageBytes As Byte() = bitmap.ExportBytes()
' Bind imageBytes to an <Image Source> in your MAUI page
在移动目标上,ExportBytes() 返回一个 PNG 字节数组,您可以将其直接输入到 StreamImageSource 或写入到 ImageButton。 MAUI 框架无需平台特定的代码路径——相同的生成逻辑在所有四个 MAUI 目标平台上运行效果完全一致。
对于 VB.NET 项目,API 接口完全一致; 仅语法有所不同。 该库提供单个 NuGet 包,无需单独的 VB.NET 程序集。
下一步计划是什么?
IronQR 覆盖了 .NET 环境中完整的 QR 生命周期——从基础生成和结构化负载编码,到利用机器学习技术读取受损或带有品牌标识的 QR 码。 该库负责处理汉字编码、错误校正配置以及跨平台图像输出,让您能够专注于应用程序特有的逻辑。
将所学知识付诸实践:
- 请查阅 C# QR 二维码读取器教程,深入了解读取 API 及结果处理。
- 请完成 C# QR 二维码生成器应用程序教程,以获取完整的项目演示。
- 浏览代码示例以查看更多生成和读取模式。
- 购买 IronQR 许可证以解锁所有功能用于生产部署,或延长免费试用期以获取更多评估时间。
常见问题解答
IronQR支持哪些.NET版本?
IronQR支持.NET Core 6、7、8、9 和 10,以及.NET Framework 4.6.2 及更高版本。它还面向.NET Standard 2.0+,因此与 Xamarin、 .NET MAUI、 Blazor和ASP.NET Core项目兼容。
如何在C#中读取图像文件中的二维码?
使用 `AnyBitmap.FromFile()` 加载图像,将其传递给 `QrImageInput`,然后调用 `QrReader.Read()`。该方法返回一个 `IEnumerable` 对象。
二维码纠错级别有哪四个?
四个等级分别为低(L,约7%恢复率)、中(M,约15%)、四分位(Q,约25%)和高(H,约30%)。更高的等级会增加冗余模块,虽然会降低净数据容量,但能提高对损坏或部分遮蔽条码的扫描可靠性。
IronQR能否读取带有标志或部分损坏的二维码?
是的。IronQR 中基于机器学习的检测模型可以处理部分损坏的二维码、嵌入式徽标、IronQR模糊和低分辨率输入,无需手动预处理。
如何使用IronQR将徽标嵌入二维码中?
将 `QrOptions` 对象的 `Logo` 属性设置为您的徽标图像的 `AnyBitmap` 类型,并将纠错级别设置为“高”。IronQRIronQR自动强制执行此约束,因为居中的徽标大约会占用 30% 的代码空间。
IronQR是否支持日语和其他Unicode字符?
是的。将任何 Unicode 字符串传递给 `QrWriter.Write()`,该库会自动选择 Kanji 模式来写入日文字符,或选择带有 ECI 标记的字节模式来写入其他 Unicode 内容。
如何在ASP.NET Core应用程序中生成二维码?
使用 `AnyBitmap.FromStream()` 读取上传的图像,并使用 `QrWriter.Write()` 生成二维码。将输出作为 MIME 类型为 `image/png` 的 `FileContentResult` 返回。将 `QrReader` 实例化为单例,以分摊机器学习模型加载成本。
IronQR是否支持跨平台?
是的。IronQR 在非 Windows 平台上使用IronQR渲染后端,通过.NET MAUI在 macOS、Linux、iOS 和 Android 上提供一致的二维码生成和读取。

