在實際環境中測試
在生產環境中測試無浮水印。
在任何需要的地方都能運作。
QR碼在我們的數位世界中已變得隨處可見,經常用於廣告、零售、活動管理等。 對於在 ASP.NET 框架中工作的開發人員而言,將 QR 碼掃描功能整合到網絡應用程式中可以增強用戶體驗和功能性。 本文探討在 ASP.NET 應用程式中實現 QR 碼掃描器的過程,涵蓋所需工具、庫和逐步實施方法。 我們將使用IronQR,一個強大的 QR 碼生成庫Iron Software讀取 QR 碼。
使用 Visual Studio 創建 ASP.NET 專案
安裝IronQR從套件管理器中獲取程式庫
上傳 QR 圖像並讀取 QR。
QR(快速反應)二維條碼是能夠儲存資訊的矩陣式條碼,範圍從URL到聯絡資訊,通常使用智能手機或專用掃描設備進行掃描。 在網頁應用程式中,QR 碼可以用於各種目的,例如:
IronQR是一個為 QR 碼生成和掃描而設計的強大 .NET 庫,以易於使用為核心提供穩健的功能。 這個多功能庫不僅可以處理 QR 碼,還可以管理其他類型的條碼,使其成為從事 .NET 生態系統開發的開發者的首選。 在此,我們將探討如何將IronQR庫整合到ASP.NET應用程序中,以便於QR碼掃描。
讀取 QR 碼:IronQR可以從各種圖像格式讀取 QR 碼,包括 jpg、png、svg、bmp、gif、tif、tiff 等。 它還支持多頁圖像和自定義 QR 檢測模型。 輸出數據格式包括文本、網址、坐標等。
寫入 QR Code:您可以生成 QR Code 並將其保存為圖像(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 標準(2.0+).NET 框架(4.6.2+)
它支持不同的項目類型,包括網頁應用程式(Blazor 和 WebForms),手機(Xamarin & MAUI),桌面(WPF & MAUI),和控制台應用程式。
廣泛的 QR 碼支援:IronQR 擅長處理各種 QR 碼和其他類型的條碼。 無論您是在處理標準 QR 碼、微型 QR 碼、QR 碼條碼圖像,還是特定格式如 Aztec 或 Data Matrix,IronQR提供完善的支援。 IronQR 也支持讀取 QR code 條碼的功能。
IronQR包括各種辦公文件工具、PDF 編輯、OCR 等在內的 .NET API 產品。
首先建立一個新專案,並選擇如下所示的MVC範本。
接下來,您應該提供專案的名稱和位置。
選擇 .NET 版本。
點擊建立按鈕將會建立以下代碼和項目。
安裝IronQR從 Visual Studio 套件管理器中獲取庫,如下所示
現在,讓我們創建一個 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 碼掃描功能。 以下是程式碼功能的簡要說明:
它構建了一個文件路徑(路径)在應用程式的 Web 根目錄中特別用於保存 QR 碼影像(「ScanQRCode」目錄).
它會檢查此目錄是否存在,如果不存在,則創建它以避免在保存文件時出現文件未找到錯誤。
它構建完整文件路徑(filePath
)上傳的 QR 碼圖片將儲存的位置("ScanQRCode/qrcode.png"). 這將覆蓋任何同名的現有文件,有效地處理新掃描而不會累積文件。
它打開一個文件流並複製上傳圖像的內容(qrImage.QRCodeImage
,可能是一個表單文件)到伺服器上的指定位置。
使用 AnyBitmap.FromFile
(文件路徑)將已保存的圖像文件載入為適合 QR 碼掃描的格式。
AnyBitmap` 可能作為輔助類,用於將圖像文件轉換為 QR 閱讀器可以處理的位圖對象。
將載入的點陣圖封裝成 QrImageInput
,這特別設計為 QR 碼讀取過程的輸入項。 實例化一個 QrReader
,這是 IronQR 程式庫的一個元件,配置用來偵測和解碼 QR 碼。
呼叫 reader.Read(圖像輸入)掃描影像以查找 QR 碼。 此方法返回一個
IEnumerable,每個
QrResult含有來自圖像中檢測到的 QR 碼的數據。 它使用
results.First提取第一個結果的值。()
.Value並將這些解碼資訊存儲在
ViewBag.QrCodeText` 中。 這假設圖像至少包含一個 QR 碼,並不處理未檢測到 QR 碼的潛在錯誤。
構造一個 URL(imageUrl
)指向伺服器上已儲存的QR碼影像。 此 URL 是利用當前 HTTP 請求的協議、主機和路徑基礎建構的,確保使用者可以查看。 生成的 URL 保存在 ViewBag.QrCodeUri
中。
返回相同的視圖(檢視()``` ```),這很可能向用戶顯示QR碼圖像和解碼後的文本。
ViewBag` 用於將 QR code 解碼的文本和圖像的 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"
}
在本文中,我們探討了如何在 ASP.NET Core 中掃描 QR 代碼。IronQR. 整合IronQR將 QR 碼掃描功能整合到 ASP.NET 應用程式是一個簡單的過程,這可以增強網絡應用程式的功能,使其更具互動性和用戶友好。 IronQR強大的功能和易用性使其成為尋找實現條碼相關功能的開發人員的絕佳選擇。