在生產環境中測試,無水印。
在任何需要的地方都能運行。
獲得 30 天的全功能產品。
在幾分鐘內上手運行。
試用產品期間完全訪問我們的支援工程團隊
QR碼在我們的數位世界中已變得隨處可見,經常用於廣告、零售、活動管理等。 對於在 ASP.NET 框架中工作的開發人員而言,將 QR 碼掃描功能整合到網絡應用程式中可以增強用戶體驗和功能性。 本文探討在 ASP.NET 應用程式中實現 QR 碼掃描器的過程,涵蓋所需工具、庫和逐步實施方法。 我們將使用IronQR,這是一個來自Iron Software的強大 QR 碼生成庫來讀取 QR 碼。
使用 Visual Studio 創建 ASP.NET 專案
從套件管理器安裝IronQR庫
上傳 QR 圖像並讀取 QR。
QR(快速响应)码是二维条形码,可以存储从网址到联系信息的各种信息,通常使用智能手机或专用扫描设备进行扫描。 在網頁應用程式中,QR 碼可以用於各種目的,例如:
IronQR 是一個強大的 .NET 函式庫,專為 QR 碼生成和掃描而設計,提供強大的功能且易於使用。 這個多功能庫不僅可以處理 QR 碼,還可以管理其他類型的條碼,使其成為從事 .NET 生態系統開發的開發者的首選。 在此,我們將探討如何將IronQR庫整合到ASP.NET應用程序中,以便於QR碼掃描。
讀取 QR 碼:IronQR 可以從各種圖像格式中讀取 QR 碼,包括 jpg、png、svg、bmp、gif、tif、tiff 等。 它還支持多頁圖像和自定義 QR 檢測模型。 輸出數據格式包括文本、網址、坐標等。
生成 QR 碼:您可以生成 QR 碼並將其儲存為圖像(jpg、png、gif、tiff、bmp)、流,甚至將其加蓋到現有的 PDF 上。 編碼文字、URL、位元組和數字等資料並生成 QR 碼。 自訂QR碼樣式可以通過調整大小、調整邊距、重新上色,以及添加標誌來實現。
錯誤處理和更正:IronQR 提供詳細的錯誤信息和自訂的QR錯誤更正。 它確保容錯能力並支援空值檢查和校驗和。
先進機器學習模型:IronQR 使用先進機器學習模型進行 QR 碼識別。 此模型確保在各種平台(包括行動裝置、桌面和雲端環境)中準確可靠地讀取 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 碼及其他類型的條碼。 無論您是處理標準QR碼、微型QR碼、QR碼條形碼影像,甚至是特定格式如Aztec或Data Matrix,IronQR 都能滿足您的需求。 IronQR 也支持讀取 QR code 條碼的功能。
IronQR 的 .NET API 產品,包括各種用於辦公文件、PDF 編輯、OCR 等的工具。
首先建立一個新專案,並選擇如下所示的MVC範本。
接下來,您應該提供專案的名稱和位置。
選擇 .NET 版本。
點擊建立按鈕將會建立以下代碼和項目。
從 Visual Studio 套件管理員安裝 IronQR 庫,如下所示
現在,讓我們創建一個 QR code 應用程式。
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 庫處理 QR 碼掃描功能。 以下是程式碼功能的簡要說明:
它在應用程式的網路根目錄內建構一個檔案路徑(path),專門用於儲存 QR 碼圖像(「ScanQRCode」目錄)。
它會檢查此目錄是否存在,如果不存在,則創建它以避免在保存文件時出現文件未找到錯誤。
它構建了完整的文件路徑(filePath
),用於保存上傳的 QR 代碼圖像("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 碼的潛在錯誤。
構建一個 URL(imageUrl
),指向伺服器上已儲存的 QR 碼圖像。 此 URL 是利用當前 HTTP 請求的協議、主機和路徑基礎建構的,確保使用者可以查看。 構建的 URL 被保存在 ViewBag.QrCodeUri
中。
返回相同的視圖(View()
),可能會向使用者顯示 QR 代碼圖像和解碼後的文本。 ViewBag
用於將 QR 碼的解碼文本和圖像的 URL 傳遞到視圖進行呈現。
新增視圖,右鍵點擊 QrCodeController
類別中的 CreateQRCode
動作方法。
選擇選項「新增視圖」,然後選擇「Razor 視圖」。 點擊「新增」。
然後選擇先前生成的"Create"樣板和模型類。
現在將視圖類中的代碼替換為下面顯示的代碼。
@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)
透過利用最新的機器學習技術,我們將QR碼讀取器提升到新的高度。 先進的機器學習模型提高了應用程式在解碼 QR 碼時的準確性和效率,即使在複雜的條件下也是如此。 無論是從靜態圖像、視頻流,還是即時攝像頭擷取的圖像中讀取QR碼,以機器學習驅動的解決方案都能迅速且可靠地提供所需資訊。 這項創新簡化了數據檢索,並通過識別真實的QR碼和標記潛在威脅來提高安全性。 借助我們的機器學習技術,您可以放心,您的 QR 碼掃描功能處於尖端,為您的用戶提供流暢且安全的體驗。
開發人員可以從這裡獲取IronQR試用許可證。 需要將鍵放置在appSettings.json中。
{
"IronQR.License.LicenseKey": "My key"
}
在本文中,我們探討了如何使用IronQR在 ASP.NET Core 中掃描 QR 碼。 將IronQR整合到 ASP.NET 應用程式中進行 QR 碼掃描是一個簡單的過程,可以增強 Web 應用程式的功能,使其更加互動和使用者友好。 IronQR的強大功能和易於使用,使其成為希望實現條碼相關功能的開發人員的絕佳選擇。