跳至页脚内容
使用 IRONQR
如何在 ASP .NET 中扫描 QR 代码

如何在 ASP .NET 中扫描 QR 代码

QR码在我们的数字世界中无处不在,常用于广告、零售、活动管理等。 对于在ASP.NET框架中工作的开发者,将QR码扫描功能集成到Web应用程序中可以增强用户体验和功能性。 本文探讨了在ASP.NET应用程序中实施QR码扫描器的过程,涵盖所需的工具、库及逐步实现。 我们将使用IronQR,一个来自Iron Software的强大QR码生成库来读取QR码。

如何在ASP.NET中扫描QR码

  1. 使用Visual Studio创建一个ASP.NET项目。
  2. 从包管理器安装IronQR库。
  3. 上传QR图像并读取QR。
  4. 读取高级QR码。

理解QR码及其使用案例

QR(快速响应)码是二维条码,可以存储从URL到联系信息的各类信息,通常通过智能手机或专用扫描设备扫描。 在Web应用程序中,QR码可以用于多种用途,例如:

  • 快速访问网站:引导用户到特定URL而无需输入。
  • 活动票务:验证门票上的QR码以进入活动。
  • 支付系统:通过扫描QR码进行便捷支付。
  • 产品信息:提供关于产品的额外信息。

介绍IronQR

IronQR是一个专为QR码生成和扫描设计的强大.NET库,以易用性提供强大的功能。 这个多功能库不仅能处理QR码,还能管理其他类型的条码,是在.NET生态系统中工作的开发者的首选。 在这里,我们将探讨如何将IronQR库集成到ASP.NET应用程序中以便进行QR码扫描。

IronQR的主要优势和特点

  1. 读取QR码IronQR能读取来自多种图像格式的QR码,包括jpg,png,svg,bmp,gif,tif,tiff等等。 它还支持多页图像和自定义QR检测模型。 输出数据格式包括文本、网址、坐标等。

  2. 生成QR码:您可以生成QR码并将其保存为图像(jpg,png,gif,tiff,bmp),流,甚至可以将其盖章到现有PDF上。 编码数据如文本,网址,字节和数字并生成QR码。 通过调整大小、调整边距、重新着色和添加徽标来自定义QR码样式。

  3. 错误处理和校正IronQR提供详细的错误信息和自定义QR错误校正。 它确保故障容错,并支持空检查和校验和。

  4. 高级机器学习模型IronQR使用高级机器学习模型进行QR码识别。 此模型确保在各种平台(包括移动、桌面和云环境)上准确可靠地读取QR码。

  5. 跨平台兼容性IronQR面向C#、F#和VB.NET设计,运行在多个.NET版本上如.NET Core(8, 7, 6, 5, 和 3.1+),.NET Standard(2.0+),.NET Framework(4.6.2+)。

  6. 它支持不同的项目类型,包括Web(Blazor & WebForms)、移动(Xamarin & MAUI)、桌面(WPF & MAUI)和控制台应用程序。

  7. 广泛的QR码支持:IronQR在处理广泛的QR码和其他类型条码方面表现出色。 无论您是在处理标准QR码、Micro QR码、QR码条码图像,甚至特定格式如Aztec或Data Matrix,IronQR都能够满足您的需求。 IronQR还支持读取QR码条码的功能。

[IronQR](Iron Suite)的.NET API产品包括多种工具,用于办公文档、PDF编辑、OCR等。

步骤 1:使用 Visual Studio 创建新 ASP.NET 项目

首先创建一个新项目,并选择如下所示的MVC模板:

如何在ASP .NET中扫描QR码:图1 - 使用Visual Studio创建一个新的ASP.NET项目

接下来,应为项目提供项目名称和位置。

如何在ASP .NET中扫描QR码:图2 - 提供项目名称及要保存的位置。

选择 .NET 版本。

如何在ASP .NET中扫描QR码:图3 - 选择要使用的.NET版本。

点击创建按钮将创建如下代码和项目。

如何在ASP .NET中扫描QR码:图4 - 点击创建按钮以获取您的项目模板

步骤 2:从 Visual Studio 包管理器中安装 IronQR 库

从Visual Studio包管理器安装IronQR库,如下所示:

如何在ASP .NET中扫描QR码:图5 - 使用Visual Studio包管理器搜索并安装IronQR

IronQR也可以通过NuGet包管理器安装。

如何在ASP .NET中扫描QR码:图6 - 通过NuGet包管理器搜索IronQR

步骤 3:上传QR图像并读取QR图像

现在,让我们创建一个QR码应用程序。

创建 QRCodeModel

// Import necessary namespaces
using System.ComponentModel.DataAnnotations;

namespace IronQRScannerAsp.Models
{
    public class QRCodeModel
    {
        // Property to hold the uploaded QR code image
        [Display(Name = "Select QR Image")]
        public IFormFile QRCodeImage { get; set; }
    }
}
// Import necessary namespaces
using System.ComponentModel.DataAnnotations;

namespace IronQRScannerAsp.Models
{
    public class QRCodeModel
    {
        // Property to hold the uploaded QR code image
        [Display(Name = "Select QR Image")]
        public IFormFile QRCodeImage { get; set; }
    }
}
' Import necessary namespaces
Imports System.ComponentModel.DataAnnotations

Namespace IronQRScannerAsp.Models
	Public Class QRCodeModel
		' Property to hold the uploaded QR code image
		<Display(Name := "Select QR Image")>
		Public Property QRCodeImage() As IFormFile
	End Class
End Namespace
$vbLabelText   $csharpLabel

创建一个二维码控制器

通过右键单击控制器文件夹并提供名称来添加一个新的控制器,如下所示:

如何在ASP .NET中扫描QR码:图7 - 通过点击文件夹并命名来添加新控制器

选择空控制器。

如何在ASP .NET中扫描QR码:图8 - 在提示上点击空控制器

提供控制器名称。

如何在ASP .NET中扫描QR码:图9 - 命名控制器

现在将以下代码添加到控制器中。

// Import necessary namespaces
using IronQr;
using IronQRScannerAsp.Models;
using IronSoftware.Drawing;
using Microsoft.AspNetCore.Mvc;

namespace IronQRScannerAsp.Controllers
{
    // Controller to handle QR code scanning functionalities
    public class QrCodeController : Controller
    {
        private readonly IWebHostEnvironment _environment;

        // Constructor for dependency injection of the hosting environment
        public QrCodeController(IWebHostEnvironment environment)
        {
            _environment = environment;
        }

        // Displays the initial View
        public IActionResult Index()
        {
            ViewBag.QrCodeText = "Text";
            return View();
        }

        // Handles the POST request to scan a QR code
        [HttpPost]
        public IActionResult ScanQRCode(QRCodeModel qrImage)
        {
            string path = Path.Combine(_environment.WebRootPath, "ScanQRCode");
            if (!Directory.Exists(path))
            {
                Directory.CreateDirectory(path);
            }

            // Define the file path for saving the uploaded QR image
            string filePath = Path.Combine(_environment.WebRootPath, "ScanQRCode/qrcode.png");
            using (var stream = System.IO.File.Create(filePath))
            {
                qrImage.QRCodeImage.CopyTo(stream); // Save uploaded image to server
            }

            // Open the asset to read a QR Code from
            var bitmap = AnyBitmap.FromFile(filePath);

            // Load the asset into QrImageInput
            QrImageInput imageInput = new QrImageInput(bitmap);

            // Create a QR Reader object
            QrReader reader = new QrReader();

            // Read the Input and get all embedded QR Codes
            IEnumerable<QrResult> results = reader.Read(imageInput);

            // Display scanned text and image on the view
            ViewBag.QrCodeText = results.First().Value;
            string imageUrl = $"{this.Request.Scheme}://{this.Request.Host}{this.Request.PathBase}" + "/ScanQRCode/qrcode.png";
            ViewBag.QrCodeUri = imageUrl;

            return View();
        }
    }
}
// Import necessary namespaces
using IronQr;
using IronQRScannerAsp.Models;
using IronSoftware.Drawing;
using Microsoft.AspNetCore.Mvc;

namespace IronQRScannerAsp.Controllers
{
    // Controller to handle QR code scanning functionalities
    public class QrCodeController : Controller
    {
        private readonly IWebHostEnvironment _environment;

        // Constructor for dependency injection of the hosting environment
        public QrCodeController(IWebHostEnvironment environment)
        {
            _environment = environment;
        }

        // Displays the initial View
        public IActionResult Index()
        {
            ViewBag.QrCodeText = "Text";
            return View();
        }

        // Handles the POST request to scan a QR code
        [HttpPost]
        public IActionResult ScanQRCode(QRCodeModel qrImage)
        {
            string path = Path.Combine(_environment.WebRootPath, "ScanQRCode");
            if (!Directory.Exists(path))
            {
                Directory.CreateDirectory(path);
            }

            // Define the file path for saving the uploaded QR image
            string filePath = Path.Combine(_environment.WebRootPath, "ScanQRCode/qrcode.png");
            using (var stream = System.IO.File.Create(filePath))
            {
                qrImage.QRCodeImage.CopyTo(stream); // Save uploaded image to server
            }

            // Open the asset to read a QR Code from
            var bitmap = AnyBitmap.FromFile(filePath);

            // Load the asset into QrImageInput
            QrImageInput imageInput = new QrImageInput(bitmap);

            // Create a QR Reader object
            QrReader reader = new QrReader();

            // Read the Input and get all embedded QR Codes
            IEnumerable<QrResult> results = reader.Read(imageInput);

            // Display scanned text and image on the view
            ViewBag.QrCodeText = results.First().Value;
            string imageUrl = $"{this.Request.Scheme}://{this.Request.Host}{this.Request.PathBase}" + "/ScanQRCode/qrcode.png";
            ViewBag.QrCodeUri = imageUrl;

            return View();
        }
    }
}
' Import necessary namespaces
Imports IronQr
Imports IronQRScannerAsp.Models
Imports IronSoftware.Drawing
Imports Microsoft.AspNetCore.Mvc

Namespace IronQRScannerAsp.Controllers
	' Controller to handle QR code scanning functionalities
	Public Class QrCodeController
		Inherits Controller

		Private ReadOnly _environment As IWebHostEnvironment

		' Constructor for dependency injection of the hosting environment
		Public Sub New(ByVal environment As IWebHostEnvironment)
			_environment = environment
		End Sub

		' Displays the initial View
		Public Function Index() As IActionResult
			ViewBag.QrCodeText = "Text"
			Return View()
		End Function

		' Handles the POST request to scan a QR code
		<HttpPost>
		Public Function ScanQRCode(ByVal qrImage As QRCodeModel) As IActionResult
			Dim path As String = System.IO.Path.Combine(_environment.WebRootPath, "ScanQRCode")
			If Not Directory.Exists(path) Then
				Directory.CreateDirectory(path)
			End If

			' Define the file path for saving the uploaded QR image
			Dim filePath As String = System.IO.Path.Combine(_environment.WebRootPath, "ScanQRCode/qrcode.png")
			Using stream = System.IO.File.Create(filePath)
				qrImage.QRCodeImage.CopyTo(stream) ' Save uploaded image to server
			End Using

			' Open the asset to read a QR Code from
			Dim bitmap = AnyBitmap.FromFile(filePath)

			' Load the asset into QrImageInput
			Dim imageInput As New QrImageInput(bitmap)

			' Create a QR Reader object
			Dim reader As New QrReader()

			' Read the Input and get all embedded QR Codes
			Dim results As IEnumerable(Of QrResult) = reader.Read(imageInput)

			' Display scanned text and image on the view
			ViewBag.QrCodeText = results.First().Value
			Dim imageUrl As String = $"{Me.Request.Scheme}://{Me.Request.Host}{Me.Request.PathBase}" & "/ScanQRCode/qrcode.png"
			ViewBag.QrCodeUri = imageUrl

			Return View()
		End Function
	End Class
End Namespace
$vbLabelText   $csharpLabel

代码解释

提供的代码片段是一个名为QrCodeController的ASP.NET Core MVC控制器,用于使用IronQR库处理QR码扫描功能。 以下是代码的简要描述:

1. 保存上传的QR码图像

路径构建

  • 它在应用程序的Web根目录中构建一个用于保存QR码图像("ScanQRCode"目录)的文件路径。
  • 它会检查此目录是否存在,如果不存在,则创建它,以避免在保存文件时出现找不到文件的错误。

文件保存

  • 它构建上传的QR码图像将要保存的完整文件路径(filePath)("ScanQRCode/qrcode.png")。 这将覆盖任何同名的现有文件,从而有效地处理新扫描,而不会积累文件。
  • 它打开一个文件流并将上传的图像(qrImage.QRCodeImage,可能是表单文件)的内容复制到服务器上指定的位置。

2. 解码QR码

读取图像文件

  • 使用AnyBitmap.FromFile(filePath)将保存的图像文件加载为适合QR码扫描的格式。 AnyBitmap可能作为一个辅助类,用于将图像文件转换为QR阅读器可以处理的位图对象。

初始化QR阅读器

  • 将加载的位图包装到QrImageInput中,专门设计为QR码读取过程的输入。
  • 实例化一个IronQR库的组成部分QrReader,配置为检测和解码QR码。

扫描QR码

  • 调用reader.Read(imageInput)来扫描图像中的QR码。 此方法返回IEnumerable<QrResult>,每个QrResult包含从图像中检测到的QR码的数据。
  • 使用results.First().Value提取第一个结果的值,并将此解码信息存储在ViewBag.QrCodeText中。 这假设图像中至少包含一个QR码,并且不处理未检测到QR码的潜在错误。

3. 准备并返回响应

图像URL构建

  • 构建一个指向服务器上保存的QR码图像的URL(imageUrl)。 此URL是使用当前HTTP请求的方案、主机和路径基构建的,确保用户可以访问并查看。
  • 构建的URL保存在ViewBag.QrCodeUri中。

视图返回

  • 返回相同的视图(View()),可能向用户显示QR码图像和解码的文本。 ViewBag用于将QR码的解码文本和图像的URL传递给视图以进行渲染。

向控制器类添加视图

新建一个视图,右键单击QrCodeController类中的CreateQRCode动作方法。

如何在ASP .NET中扫描QR码:图10 - 在`QrCodeController`类中添加新视图

选择"添加视图"选项,然后选择"Razor视图"。 点击"添加"。

如何在ASP .NET中扫描QR码:图11 - 选择添加视图选项,然后选择Razor视图,然后点击添加

然后选择先前生成的"创建"模板和模型类。

如何在ASP .NET中扫描QR码:图12 - 选择先前生成的创建模板

现在用下面显示的代码替换视图类中的代码。

@model IronQRScannerAsp.Models.QRCodeModel

@{
    ViewData["Title"] = "ScanQRCode";
}

<h1>ScanQRCode</h1>
<h4>QRCodeModel</h4>
<hr />
<div class="row">
    <div class="col-md-14">
        <form asp-action="ScanQRCode" enctype="multipart/form-data">
            <div asp-validation-summary="ModelOnly" class="text-danger"></div>
            <div class="form-group">
                <label for="QRCodeImage">Select QR Image:</label>
                <input asp-for="QRCodeImage" class="form-control" type="file" />
            </div>
            <div class="form-group">
                <input type="submit" value="Upload" class="btn btn-primary" />
            </div>
        </form>
    </div>
</div>
<div>
    <h3>Scanned Text:</h3>
    <h4>@ViewBag.QrCodeText</h4>
    @if (ViewBag.QrCodeUri != null)
    {
        <img src="@ViewBag.QrCodeUri" class="img-thumbnail" />
    }
</div>
<div>
    <a asp-action="Index">Clear</a>
</div>

@section Scripts {
    @{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}

现在在Program.cs中更改以下代码,将以上视图作为默认路由:

app.MapControllerRoute(
    name: "default",
    pattern: "{controller=QrCode}/{action=Index}");
app.MapControllerRoute(
    name: "default",
    pattern: "{controller=QrCode}/{action=Index}");
app.MapControllerRoute(name:= "default", pattern:= "{controller=QrCode}/{action=Index}")
$vbLabelText   $csharpLabel

这将默认路由从HomeController更改为我们的QrCode控制器。

输入带有URL的图像:https://ironsoftware.com/csharp/qr/

如何在ASP .NET中扫描QR码:图13 - 示例QR码输入

输出

如何在ASP .NET中扫描QR码:图14 - 按照以上步骤后示例输出

在页面上,选择一个QR码图像并点击上传以解码QR码。 此应用程序还可以修改为从视频源读取并显示结果。

步骤4:读取高级QR码

要读取高级QR码,IronQR提供以下设置。

// Import necessary namespaces
using IronQr;
using IronSoftware.Drawing;
using IronQr.Enum;
using System.Collections.Generic;

// Load an image file as a bitmap
var inputBmp = AnyBitmap.FromFile("QrImage.png");

// Use Auto => Machine Learning Scan
QrImageInput scan_ML_and_normal = new QrImageInput(inputBmp, QrScanMode.OnlyDetectionModel);
IEnumerable<QrResult> results1 = new QrReader().Read(scan_ML_and_normal);

// Use Machine Learning Scan - High Speed
QrImageInput scan_ML_only = new QrImageInput(inputBmp, QrScanMode.OnlyDetectionModel);
IEnumerable<QrResult> results2 = new QrReader().Read(scan_ML_only);

// Use Scan without Machine Learning
QrImageInput scan_normal_only = new QrImageInput(inputBmp, QrScanMode.OnlyBasicScan);
IEnumerable<QrResult> results3 = new QrReader().Read(scan_normal_only);
// Import necessary namespaces
using IronQr;
using IronSoftware.Drawing;
using IronQr.Enum;
using System.Collections.Generic;

// Load an image file as a bitmap
var inputBmp = AnyBitmap.FromFile("QrImage.png");

// Use Auto => Machine Learning Scan
QrImageInput scan_ML_and_normal = new QrImageInput(inputBmp, QrScanMode.OnlyDetectionModel);
IEnumerable<QrResult> results1 = new QrReader().Read(scan_ML_and_normal);

// Use Machine Learning Scan - High Speed
QrImageInput scan_ML_only = new QrImageInput(inputBmp, QrScanMode.OnlyDetectionModel);
IEnumerable<QrResult> results2 = new QrReader().Read(scan_ML_only);

// Use Scan without Machine Learning
QrImageInput scan_normal_only = new QrImageInput(inputBmp, QrScanMode.OnlyBasicScan);
IEnumerable<QrResult> results3 = new QrReader().Read(scan_normal_only);
' Import necessary namespaces
Imports IronQr
Imports IronSoftware.Drawing
Imports IronQr.Enum
Imports System.Collections.Generic

' Load an image file as a bitmap
Private inputBmp = AnyBitmap.FromFile("QrImage.png")

' Use Auto => Machine Learning Scan
Private scan_ML_and_normal As New QrImageInput(inputBmp, QrScanMode.OnlyDetectionModel)
Private results1 As IEnumerable(Of QrResult) = (New QrReader()).Read(scan_ML_and_normal)

' Use Machine Learning Scan - High Speed
Private scan_ML_only As New QrImageInput(inputBmp, QrScanMode.OnlyDetectionModel)
Private results2 As IEnumerable(Of QrResult) = (New QrReader()).Read(scan_ML_only)

' Use Scan without Machine Learning
Private scan_normal_only As New QrImageInput(inputBmp, QrScanMode.OnlyBasicScan)
Private results3 As IEnumerable(Of QrResult) = (New QrReader()).Read(scan_normal_only)
$vbLabelText   $csharpLabel

通过利用最新的ML技术,我们将QR码阅读器提升到新高度。 先进的ML模型提高了应用程序在复杂条件下解码QR码的准确性和效率。 无论是从静态图像、视频流还是实时摄像头读取QR码,ML驱动的解决方案都能快速可靠地提供所需信息。 这种创新简化了数据检索,并通过识别真正的QR码和标记潜在威胁来增强安全性。 使用我们的ML技术,您可以确信您的QR码扫描能力处于前沿,并为用户提供顺畅和安全的体验

许可(提供试用)

开发人员可以在这里获得IronQR试用许可证。 Key需要放置在appSettings.json中。

{
  "IronQR.License.LicenseKey": "My Key"
}

结论

在这篇文章中,我们探讨了如何使用IronQR在ASP.NET Core中扫描QR码。 将IronQR集成到ASP.NET应用程序中进行QR码扫描是一个简便的过程,可增强Web应用程序的功能,使其更具互动性和用户友好。 IronQR强大的功能和易用性使其成为开发者想要实现条码相关功能的绝佳选择。

常见问题解答

如何在ASP.NET应用程序中实现二维码扫描器?

要在ASP.NET应用程序中实现二维码扫描器,首先在Visual Studio中创建一个新项目,通过包管理器安装IronQR库,并添加代码处理使用IronQR强大功能进行二维码扫描。

在ASP.NET中设置QRCodeModel的步骤是哪些?

在ASP.NET中设置QRCodeModel,定义处理二维码数据的模型类,使用IronQR处理输入,并确保ASP.NET应用程序可以管理二维码扫描和结果显示。

IronQR可以读取不同图像格式的二维码吗?

是的,IronQR可以从多种图像格式读取二维码,包括jpg, png, svg, bmp, gif, tif, tiff和多页图像,使其在各种应用中具有通用性。

IronQR如何利用机器学习进行二维码扫描?

IronQR采用先进的机器学习模型来提高二维码扫描的准确性,确保在不同环境和平台中可靠而精确地读取。

我可以使用什么平台进行IronQR的二维码扫描?

IronQR支持广泛的平台包括Web应用程序(Blazor & WebForms), 手机应用(Xamarin & MAUI), 桌面应用(WPF & MAUI), 和控制台应用程序,兼容C#, F#, 和VB.NET。

如何在ASP.NET中处理二维码扫描的文件上传?

在ASP.NET中,通过设置一个控制器接收文件来管理二维码扫描的文件上传,然后使用IronQR有效地处理和扫描上传的二维码图像。

IronQR可以从视频流中扫描二维码吗?

是的,IronQR可以调整为从视频流中扫描二维码,扩展其在需要实时数据处理的动态环境中的应用。

IronQR有什么许可选项?

IronQR提供可从Iron Software网站获得的试用许可。开发者应将许可证密钥放在appSettings.json文件中以激活试用。

在ASP.NET中使用IronQR进行二维码扫描有哪些好处?

在ASP.NET中使用IronQR进行二维码扫描的好处包括易于集成,支持多种图像格式,机器学习增强的准确性以及跨平台兼容性。

如何在ASP.NET中使用IronQR自定义二维码创建?

要在ASP.NET中使用IronQR自定义二维码创建,利用库的功能修改二维码大小、颜色和嵌入数据,根据特定的应用需求定制输出。

Jordi Bardia
软件工程师
Jordi 最擅长 Python、C# 和 C++,当他不在 Iron Software 利用这些技能时,他就在游戏编程。分享产品测试、产品开发和研究的责任,Jordi 在持续的产品改进中增加了巨大的价值。多样的经验使他面临挑战并保持投入,他表示这是在 Iron Software 工作的最喜欢的方面之一。Jordi 在佛罗里达州迈阿密长大,并在佛罗里达大学学习计算机科学和统计学。