在生产环境中测试,无水印。
随时随地满足您的需求。
获得30天的全功能产品。
几分钟内就能启动并运行。
在您的产品试用期间,全面访问我们的支持工程团队。
QR 码在我们的数字世界中已经无处不在,经常用于广告、零售、活动管理等领域。 对于在 ASP.NET Framework 中工作的开发人员来说,将二维码扫描功能集成到网络应用程序中可以增强用户体验和功能。 本文探讨了在 ASP.NET 应用程序中实施 QR 码扫描器的过程,包括所需的工具、库和逐步实施。 我们将使用IronQR,这是一个强大的QR码生成库,由Iron Software提供,用于读取QR码。
使用 Visual Studio 创建 ASP.NET 项目
从包管理器安装IronQR库
上传 QR 图像并阅读 QR。
QR(快速响应)码是二维条形码,可以存储从URL到联系信息的数据,通常使用智能手机或专用扫描设备进行扫描。 在网络应用程序中,QR 代码有多种用途,如
IronQR 是一个强大的 .NET 库,专为二维码生成和扫描而设计,提供强大的功能并注重易用性。 这个多功能库不仅可以处理 QR 代码,还可以管理其他类型的 BarCode,因此成为在 .NET 生态系统内工作的开发人员的首选。 在此,我们将探讨如何将 IronQR 库集成到 ASP.NET 应用程序中,以方便 QR 码扫描。
读取二维码:IronQR 可以读取来自各种图像格式的二维码,包括 jpg、png、svg、bmp、gif、tif、tiff 等。 它还支持多页图像和自定义 QR 检测模型。 输出数据格式包括文本、URL、坐标等。
生成二维码:您可以生成二维码并将其保存为图像(jpg、png、gif、tiff、bmp)、流,甚至将其印刻到现有的PDF上。 对文本、URL、字节和数字等数据进行编码,并生成 QR 码。 通过调整大小、调整边距、重新着色和添加徽标来定制二维码样式。
错误处理和更正:IronQR 提供详细的错误信息和自定义的QR错误更正。 确保容错并支持空检查和校验。
高级机器学习模型:IronQR 使用高级机器学习模型来识别二维码。 这种模式可确保在各种平台(包括移动、桌面和云环境)上准确可靠地读取 QR 代码。
跨平台兼容性:IronQR专为C#、F#和VB.NET设计,运行于各种.NET版本,如.NET Core(8、7、6、5和3.1+)、.NET Standard(2.0+)、.NET Framework(4.6.2+)。
它支持不同的项目类型,包括网络(Blazor 和 WebForms)、移动(Xamarin 和 MAUI)、桌面(WPF 和 MAUI)以及控制台应用程序。
广泛的QR码支持:IronQR擅长处理各种QR码及其他类型的条形码。 无论您是处理标准二维码、微型二维码、二维码条码图像,还是特定格式如Aztec或Data Matrix,IronQR 都能满足您的需求。 IronQR 还支持读取 QR 码 BarCode 的功能。
IronQR 的 .NET API 产品,包括用于办公文档、PDF 编辑、OCR 等的各种工具。
首先创建一个新项目并选择 MVC 模板,如下所示
接下来,您应提供项目名称和项目地点。
选择 .NET 版本。
点击创建按钮将创建以下代码和项目。
从 Visual Studio 包管理器安装IronQR库,如下所示
现在,让我们创建一个 QR 码应用程序。
QrCode
模型using System.ComponentModel.DataAnnotations;
namespace IronQRScannerAsp.Models
{
public class QRCodeModel
{
[Display(Name = "Select QR Image")]
public IFormFile QRCodeImage
{
get;
set;
}
}
}
using System.ComponentModel.DataAnnotations;
namespace IronQRScannerAsp.Models
{
public class QRCodeModel
{
[Display(Name = "Select QR Image")]
public IFormFile QRCodeImage
{
get;
set;
}
}
}
Imports System.ComponentModel.DataAnnotations
Namespace IronQRScannerAsp.Models
Public Class QRCodeModel
<Display(Name := "Select QR Image")>
Public Property QRCodeImage() As IFormFile
End Class
End Namespace
右键单击控制器文件夹并提供如下所示的名称,添加一个新控制器:
选择空控制器。
提供控制器名称。
现在将以下代码添加到控制器中。
using IronQr;
using IronQRScannerAsp.Models;
using IronSoftware.Drawing;
using Microsoft.AspNetCore.Mvc;
namespace IronQRScannerAsp.Controllers
{
public class QrCodeController : Controller
{
private readonly IWebHostEnvironment _environment;
public QrCodeController(IWebHostEnvironment environment)
{
_environment = environment;
}
public IActionResult Index()
{
ViewBag.QrCodeText = "Text";
return View();
}
[HttpPost]
public IActionResult ScanQRCode(QRCodeModel qrImage)
{
string path = Path.Combine(_environment.WebRootPath, "ScanQRCode");
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
string filePath = Path.Combine(_environment.WebRootPath, "ScanQRCode/qrcode.png");
using (var stream = System.IO.File.Create(filePath))
{
qrImage.QRCodeImage.CopyTo(stream);
}
// 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 an get all embedded QR Codes
IEnumerable<QrResult> results = reader.Read(imageInput);
ViewBag.QrCodeText = results.First().Value;
string imageUrl = $"{this.Request.Scheme}://{this.Request.Host}{this.Request.PathBase}" + "/ScanQRCode/qrcode.png";
ViewBag.QrCodeUri = imageUrl;
return View();
}
}
}
using IronQr;
using IronQRScannerAsp.Models;
using IronSoftware.Drawing;
using Microsoft.AspNetCore.Mvc;
namespace IronQRScannerAsp.Controllers
{
public class QrCodeController : Controller
{
private readonly IWebHostEnvironment _environment;
public QrCodeController(IWebHostEnvironment environment)
{
_environment = environment;
}
public IActionResult Index()
{
ViewBag.QrCodeText = "Text";
return View();
}
[HttpPost]
public IActionResult ScanQRCode(QRCodeModel qrImage)
{
string path = Path.Combine(_environment.WebRootPath, "ScanQRCode");
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
string filePath = Path.Combine(_environment.WebRootPath, "ScanQRCode/qrcode.png");
using (var stream = System.IO.File.Create(filePath))
{
qrImage.QRCodeImage.CopyTo(stream);
}
// 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 an get all embedded QR Codes
IEnumerable<QrResult> results = reader.Read(imageInput);
ViewBag.QrCodeText = results.First().Value;
string imageUrl = $"{this.Request.Scheme}://{this.Request.Host}{this.Request.PathBase}" + "/ScanQRCode/qrcode.png";
ViewBag.QrCodeUri = imageUrl;
return View();
}
}
}
Imports IronQr
Imports IronQRScannerAsp.Models
Imports IronSoftware.Drawing
Imports Microsoft.AspNetCore.Mvc
Namespace IronQRScannerAsp.Controllers
Public Class QrCodeController
Inherits Controller
Private ReadOnly _environment As IWebHostEnvironment
Public Sub New(ByVal environment As IWebHostEnvironment)
_environment = environment
End Sub
Public Function Index() As IActionResult
ViewBag.QrCodeText = "Text"
Return View()
End Function
<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
Dim filePath As String = System.IO.Path.Combine(_environment.WebRootPath, "ScanQRCode/qrcode.png")
Using stream = System.IO.File.Create(filePath)
qrImage.QRCodeImage.CopyTo(stream)
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 an get all embedded QR Codes
Dim results As IEnumerable(Of QrResult) = reader.Read(imageInput)
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
所提供的代码片段用于名为 QrCodeController 的 ASP.NET Core MVC 控制器,该控制器旨在使用 IronQR 库处理二维码扫描功能。 以下是代码作用的简要说明:
它在应用程序的Web根目录中构建一个文件路径(path),专门用于保存二维码图像("ScanQRCode"目录)。
它将检查该目录是否存在,如果不存在,则创建该目录,以避免在保存文件时出现找不到文件的错误。
它构建完整的文件路径(filePath
),用于保存上传的二维码图像(“ScanQRCode/qrcode.png”)。 这将覆盖同名的任何现有文件,有效处理新扫描,而不会累积文件。
它打开一个文件流,并将上传的图像(qrImage.QRCodeImage
,可能是一个表单文件)的内容复制到服务器上的指定位置。
使用 AnyBitmap.FromFile(filePath)
将保存的图像文件加载到适合 QR 码扫描的格式。 AnyBitmap
可能作为助手类,将图像文件转换为QR读取器可以处理的位图对象。
将加载的位图包装到QrImageInput
中,该框架特别设计为QR代码读取过程的输入。 实例化一个QrReader
,这是IronQR库的一个组件,用于检测和解码QR码。
调用reader.Read(imageInput)
来扫描图像以识别QR码。 此方法返回一个IEnumerable<QrResult>
,其中每个QrResult
都包含图像中检测到的QR码的数据。 它使用results.First().Value
提取第一个结果的值,并将此解码信息存储在ViewBag.QrCodeText
中。 译文假定图片至少包含一个 QR 码,并且不处理未检测到 QR 码的潜在错误。
构建一个指向服务器上已保存的QR码图像的URL(imageUrl
)。 该 URL 使用当前 HTTP 请求的方案、主机和路径基础构建,确保用户可以访问查看。 构建的 URL 保存在 ViewBag.QrCodeUri
中。
返回相同的视图(View()
),这可能会向用户显示二维码图像和解码文本。 使用ViewBag
将QR码的解码文本和图像的URL传递到视图进行呈现。
为新的视图添加,右键单击QrCodeController
类中的CreateQRCode
操作方法。
选择 "添加视图 "选项,然后选择 "Razor View"。 点击 "添加"。
然后选择之前生成的 "创建 "模板和模型类。
现在将视图类中的代码替换为下图所示的代码。
@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">
</div>
<div class="form-group">
<h3>Scanned Text:</h3>
<h4>@ViewBag.QrCodeText</h4>
</div>
<div class="form-group">
<img src="@ViewBag.QrCodeUri" class="img-thumbnail" />
</div>
</form>
</div>
</div>
<div>
<a asp-action="Index">Clear</a>
</div>
@section Scripts {
@{
await Html.RenderPartialAsync("_ValidationScriptsPartial");
}
}
@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">
</div>
<div class="form-group">
<h3>Scanned Text:</h3>
<h4>@ViewBag.QrCodeText</h4>
</div>
<div class="form-group">
<img src="@ViewBag.QrCodeUri" class="img-thumbnail" />
</div>
</form>
</div>
</div>
<div>
<a asp-action="Index">Clear</a>
</div>
@section Scripts {
@{
await Html.RenderPartialAsync("_ValidationScriptsPartial");
}
}
model ReadOnly Property () As IronQRScannerAsp.Models.QRCodeModel
ViewData("Title") = "ScanQRCode"
End Property
'INSTANT VB WARNING: An assignment within expression was extracted from the following statement:
'ORIGINAL LINE: <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"> </div> <div class="form-group"> <h3> Scanned Text:</h3> <h4> @ViewBag.QrCodeText</h4> </div> <div class="form-group"> <img src="@ViewBag.QrCodeUri" class="img-thumbnail" /> </div> </form> </div> </div> <div> <a asp-action="Index"> Clear</a> </div> @section Scripts
"form-group"> </div> <div class="form-group"> (Of h3) Scanned Text
Inherits </h3>(Of h4) ViewBag.QrCodeText</h4> </div> <div class="form-group"> <img src="@ViewBag.QrCodeUri" class="img-thumbnail" /> </div> </form> </div> </div> (Of div) <a asp-action="Index"> Clear</a> </div> section Scripts
'INSTANT VB WARNING: An assignment within expression was extracted from the following statement:
'ORIGINAL LINE: Friend <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"> </div> <div class
"text-danger"></div> <div class="form-group"> </div> <div class
'INSTANT VB WARNING: An assignment within expression was extracted from the following statement:
'ORIGINAL LINE: Private Friend <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
"ModelOnly" class="text-danger"></div> <div class
'INSTANT VB WARNING: An assignment within expression was extracted from the following statement:
'ORIGINAL LINE: Private Private Friend <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
"multipart/form-data"> <div asp-validation-summary="ModelOnly" class
'INSTANT VB WARNING: An assignment within expression was extracted from the following statement:
'ORIGINAL LINE: Private Private Private Friend <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
"ScanQRCode" enctype="multipart/form-data"> <div asp-validation-summary
'INSTANT VB WARNING: An assignment within expression was extracted from the following statement:
'ORIGINAL LINE: Private Private Private Private Friend <h1> ScanQRCode</h1> <h4> QRCodeModel</h4> <hr /> <div Class="row"> <div class="col-md-14"> <form asp-action="ScanQRCode" enctype
"col-md-14"> <form asp-action="ScanQRCode" enctype
'INSTANT VB WARNING: An assignment within expression was extracted from the following statement:
'ORIGINAL LINE: Private Private Private Private Private Friend <h1> ScanQRCode</h1> <h4> QRCodeModel</h4> <hr /> <div Class="row"> <div class="col-md-14"> <form asp-action
"row"> <div class="col-md-14"> <form asp-action
'INSTANT VB WARNING: Instant VB cannot determine whether both operands of this division are integer types - if they are then you should use the VB integer division operator:
Private Private Private Private Private Private Private Friend (Of h1) ScanQRCode</h1> (Of h4) QRCodeModel</h4> <hr /> <div Class="row"> <div class
@
If True Then
Await Html.RenderPartialAsync("_ValidationScriptsPartial")
End If
End Class
现在在 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}")
这将默认路由从HomeController
更改为我们的QrCode
控制器。
输入图像的URL:https://ironsoftware.com/csharp/qr/。
在页面上选择一个 QR 代码图像,然后点击上传以解码 QR 代码。 此应用程序也可修改为从视频源读取并显示结果。
要读取高级 QR 代码,IronQR 提供以下设置。
using IronQr;
using IronSoftware.Drawing;
using IronQr.Enum;
using System.Collections.Generic;
var inputBmp = AnyBitmap.FromFile("QrImage.png");
// Use Auto => Machine Learning Scan
// Careful Scan => Useful for scanning documents slowly and carefully
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 => For scanning frames from a camera
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);
using IronQr;
using IronSoftware.Drawing;
using IronQr.Enum;
using System.Collections.Generic;
var inputBmp = AnyBitmap.FromFile("QrImage.png");
// Use Auto => Machine Learning Scan
// Careful Scan => Useful for scanning documents slowly and carefully
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 => For scanning frames from a camera
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);
Imports IronQr
Imports IronSoftware.Drawing
Imports IronQr.Enum
Imports System.Collections.Generic
Private inputBmp = AnyBitmap.FromFile("QrImage.png")
' Use Auto => Machine Learning Scan
' Careful Scan => Useful for scanning documents slowly and carefully
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 => For scanning frames from a camera
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)
通过利用最新的 ML 技术,我们将 QR 码阅读器提升到了新的高度。 即使在复杂的条件下,复杂的 ML 模型也能提高应用程序解码 QR 代码的准确性和效率。 无论是从静态图像、视频流还是实时摄像机画面中读取 QR 码,由 ML 驱动的解决方案都能快速、可靠地提供所需的信息。 这项创新通过识别真实 QR 代码和标记潜在威胁,简化了数据检索并提高了安全性。 有了我们的 ML 技术,您可以确信您的二维码扫描功能处于最前沿,为您的用户提供流畅、安全的体验。
开发人员可以通过此处获取IronQR试用许可证。 密钥需要放在 appSettings.json 中。
{
"IronQR.License.LicenseKey": "My key"
}
在本文中,我们探讨了如何在 ASP.NET Core 中使用 IronQR 扫描二维码。 将IronQR集成到ASP.NET应用程序中用于二维码扫描是一个简单的过程,可以增强Web应用程序的功能,使其更加互动且用户友好。 IronQR 强大的功能和易用性使其成为希望实现条码相关功能的开发人员的绝佳选择。