如何在 Blazor 中使用條碼掃描器 | IronBarcode

Using IronBarcode With Blazor

This article was translated from English: Does it need improvement?
Translated
View the article in English

這篇操作指南包含詳細的步驟說明如何在 Blazor 專案中整合 IronBarcode。 舉例來說,我們將在 Blazor 應用程式中使用 IronBarcode 來掃描從使用者的相機捕捉的條碼/QR。

class="hsg-featured-snippet">

如何在 Blazor 中使用條碼掃描器

  1. 安裝 C# 程式庫以在 Blazor 中掃描條碼
  2. 創建 Blazor 伺服專案並新增一個 Razor 元件
  3. 使用 JavaScript 啟用網路攝影機
  4. 設定 影像捕捉 方法以將影像傳送至伺服器
  5. 利用 BarcodeReader.Read 方法解碼條碼

建立 Blazor 專案

打開 Visual Studio => 建立新專案 => Blazor 伺服應用程式:

CreateBlazorProject related to 建立 Blazor 專案

設置專案名稱和位置:

ProjectName related to 建立 Blazor 專案

選擇 .NET 6 框架(或其他現代 Standard .NET 版本):

SelectFramework related to 建立 Blazor 專案

準備完成:

MainScreen related to 建立 Blazor 專案

要添加網路攝影機支持,新增一個 Razor 元件:

NewRazorComponent related to 建立 Blazor 專案

給它命名,然後點擊 Add

NewRazorComponentName related to 建立 Blazor 專案

通過 JavaScript 啟用網路攝影機功能

由於此應用程式與使用者的網路攝影機合作,應在客戶端進行處理以確保隱私。 向專案添加一個 JavaScript 文件來處理網路攝影機功能,並將其命名為 webcam.js

JavascriptFileLocation related to 通過 JavaScript 啟用網路攝影機功能

別忘了在 index.html 中包含 webcam.js 的參考:

<script src="webcam.js"></script>
<script src="webcam.js"></script>
HTML

將以下代碼添加到 webcam.js

// Current video stream
let videoStream;

// Function to initialize camera access and stream it to a video element
async function initializeCamera() {
    const canvas = document.querySelector("#canvas");
    const video = document.querySelector("#video");

    // Check if navigator supports media devices
    if (!("mediaDevices" in navigator) || !("getUserMedia" in navigator.mediaDevices)) {
        alert("Camera API is not available in your browser");
        return;
    }

    // Define video constraints
    const constraints = {
        video: {
            width: { min: 180 },
            height: { min: 120 }
        },
    };

    // Set camera facing mode: "user" for front camera, "environment" for back camera
    constraints.video.facingMode = useFrontCamera ? "user" : "environment";

    try {
        // Request camera access
        videoStream = await navigator.mediaDevices.getUserMedia(constraints);
        video.srcObject = videoStream;
    } catch (err) {
        alert("Could not access the camera: " + err);
    }
}
// Current video stream
let videoStream;

// Function to initialize camera access and stream it to a video element
async function initializeCamera() {
    const canvas = document.querySelector("#canvas");
    const video = document.querySelector("#video");

    // Check if navigator supports media devices
    if (!("mediaDevices" in navigator) || !("getUserMedia" in navigator.mediaDevices)) {
        alert("Camera API is not available in your browser");
        return;
    }

    // Define video constraints
    const constraints = {
        video: {
            width: { min: 180 },
            height: { min: 120 }
        },
    };

    // Set camera facing mode: "user" for front camera, "environment" for back camera
    constraints.video.facingMode = useFrontCamera ? "user" : "environment";

    try {
        // Request camera access
        videoStream = await navigator.mediaDevices.getUserMedia(constraints);
        video.srcObject = videoStream;
    } catch (err) {
        alert("Could not access the camera: " + err);
    }
}
JAVASCRIPT

我們需要打開使用者的網路攝影機。 在頁面加載時覆寫 OnInitializedAsync() 方法來進行此操作。 調用您先前編寫的 JavaScript 函數 initializeCamera()

protected override async Task OnInitializedAsync()
{
    await JSRuntime.InvokeVoidAsync("initializeCamera");
}
protected override async Task OnInitializedAsync()
{
    await JSRuntime.InvokeVoidAsync("initializeCamera");
}
Protected Overrides Async Function OnInitializedAsync() As Task
	Await JSRuntime.InvokeVoidAsync("initializeCamera")
End Function
$vbLabelText   $csharpLabel

現在,添加將運行網路攝影機視頻流的 HTML 標籤:

<section class="section">
    <video autoplay id="video" width="320"></video>
</section>
<section class="section">
    <video autoplay id="video" width="320"></video>
</section>
HTML

捕捉圖像

要從網路攝影機視頻流中捕捉畫面,讓我們在 webcam.js 中編寫另一個 JavaScript 函數。 這個函數將當前影像從源視頻繪製到目標畫布。

// Function to capture a frame from the video and send it to the server via Blazor
function getFrame(dotNetHelper) {
    // Set canvas dimensions to match video
    canvas.width = video.videoWidth;
    canvas.height = video.videoHeight;

    // Draw the current video frame onto the canvas
    canvas.getContext('2d').drawImage(video, 0, 0);

    // Convert the canvas content to a base64 encoded PNG image
    let dataUrl = canvas.toDataURL("image/png");

    // Send the image data to the C# method `ProcessImage`
    dotNetHelper.invokeMethodAsync('ProcessImage', dataUrl);
}
// Function to capture a frame from the video and send it to the server via Blazor
function getFrame(dotNetHelper) {
    // Set canvas dimensions to match video
    canvas.width = video.videoWidth;
    canvas.height = video.videoHeight;

    // Draw the current video frame onto the canvas
    canvas.getContext('2d').drawImage(video, 0, 0);

    // Convert the canvas content to a base64 encoded PNG image
    let dataUrl = canvas.toDataURL("image/png");

    // Send the image data to the C# method `ProcessImage`
    dotNetHelper.invokeMethodAsync('ProcessImage', dataUrl);
}
JAVASCRIPT

此函數將捕捉畫面,將其編碼為 base64,然後將編碼圖像發送到名為 ProcessImage() 的 C# 方法中。 ProcessImage() 方法如下:將編碼的圖像發送到伺服器端 API 進行處理。

[JSInvokable]
public async Task ProcessImage(string imageString)
{
    // Create an image object containing the base64 data
    var imageObject = new CamImage();
    imageObject.imageDataBase64 = imageString;

    // Serialize image object to JSON
    var jsonObj = System.Text.Json.JsonSerializer.Serialize(imageObject);

    // Send image data to server-side API for processing
    var barcodeeResult = await Http.PostAsJsonAsync("Ironsoftware/ReadBarCode", imageObject);
    if (barcodeeResult.StatusCode == System.Net.HttpStatusCode.OK)
    {
        QRCodeResult = await barcodeeResult.Content.ReadAsStringAsync();
        StateHasChanged();
    }
}
[JSInvokable]
public async Task ProcessImage(string imageString)
{
    // Create an image object containing the base64 data
    var imageObject = new CamImage();
    imageObject.imageDataBase64 = imageString;

    // Serialize image object to JSON
    var jsonObj = System.Text.Json.JsonSerializer.Serialize(imageObject);

    // Send image data to server-side API for processing
    var barcodeeResult = await Http.PostAsJsonAsync("Ironsoftware/ReadBarCode", imageObject);
    if (barcodeeResult.StatusCode == System.Net.HttpStatusCode.OK)
    {
        QRCodeResult = await barcodeeResult.Content.ReadAsStringAsync();
        StateHasChanged();
    }
}
<JSInvokable>
Public Async Function ProcessImage(ByVal imageString As String) As Task
	' Create an image object containing the base64 data
	Dim imageObject = New CamImage()
	imageObject.imageDataBase64 = imageString

	' Serialize image object to JSON
	Dim jsonObj = System.Text.Json.JsonSerializer.Serialize(imageObject)

	' Send image data to server-side API for processing
	Dim barcodeeResult = Await Http.PostAsJsonAsync("Ironsoftware/ReadBarCode", imageObject)
	If barcodeeResult.StatusCode = System.Net.HttpStatusCode.OK Then
		QRCodeResult = Await barcodeeResult.Content.ReadAsStringAsync()
		StateHasChanged()
	End If
End Function
$vbLabelText   $csharpLabel

它處理將編碼圖像從 JavaScript 中的 getFrame() 發送到伺服器端 API 進行處理。

接下來,我們需要在按下 Capture Frame 按鈕時調用此 JavaScript 函數。 記得,我們的按鈕正在尋找一個名為 CaptureFrame 的處理函數。

private async Task CaptureFrame()
{
    await JSRuntime.InvokeAsync<String>("getFrame", DotNetObjectReference.Create(this));
}
private async Task CaptureFrame()
{
    await JSRuntime.InvokeAsync<String>("getFrame", DotNetObjectReference.Create(this));
}
Private Async Function CaptureFrame() As Task
	Await JSRuntime.InvokeAsync(Of String)("getFrame", DotNetObjectReference.Create(Me))
End Function
$vbLabelText   $csharpLabel

IronBarcode 提取捕捉的圖像

將 IronBarcode NuGet 套件添加到伺服器專案:

dotnet add package IronBarCode

現在,在伺服器專案中,添加一個 API 方法來處理編碼圖像並提取條碼/QR 值。 下面的代碼將條碼讀取功能添加到 Blazor 專案中。 從掃描的圖像中,我們進行影像預處理然後將其傳入 FromStream 方法。 將 Image 對象傳入 BarcodeReader 類中的方法以掃描 Blazor 中的條碼。 結果條碼值隨後可以從 BarcodeResult 對象的 Value 屬性中獲取。

[HttpPost]
[Route("ReadBarCode")]
public string ReadBarCode(CamImage imageData)
{
    try
    {
        // Decode the base64 image data
        var splitObject = imageData.imageDataBase64.Split(',');
        byte[] imagebyteData = Convert.FromBase64String((splitObject.Length > 1) ? splitObject[1] : splitObject[0]);

        // Set IronBarcode license key (replace 'Key' with actual key)
        IronBarCode.License.LicenseKey = "Key";

        using (var ms = new MemoryStream(imagebyteData))
        {
            // Convert byte array to Image
            Image barcodeImage = Image.FromStream(ms);
            // Read barcode from Image
            var result = BarcodeReader.Read(barcodeImage);
            if (result == null || result.Value == null)
            {
                return $"{DateTime.Now}: Barcode is Not Detected";
            }

            return $"{DateTime.Now}: Barcode is ({result.Value})";
        }
    }
    catch (Exception ex)
    {
        return $"Exception: {ex.Message}";
    }
}

// Model to encapsulate the base64 image data
public class CamImage
{
    public string imageDataBase64 { get; set; }
}
[HttpPost]
[Route("ReadBarCode")]
public string ReadBarCode(CamImage imageData)
{
    try
    {
        // Decode the base64 image data
        var splitObject = imageData.imageDataBase64.Split(',');
        byte[] imagebyteData = Convert.FromBase64String((splitObject.Length > 1) ? splitObject[1] : splitObject[0]);

        // Set IronBarcode license key (replace 'Key' with actual key)
        IronBarCode.License.LicenseKey = "Key";

        using (var ms = new MemoryStream(imagebyteData))
        {
            // Convert byte array to Image
            Image barcodeImage = Image.FromStream(ms);
            // Read barcode from Image
            var result = BarcodeReader.Read(barcodeImage);
            if (result == null || result.Value == null)
            {
                return $"{DateTime.Now}: Barcode is Not Detected";
            }

            return $"{DateTime.Now}: Barcode is ({result.Value})";
        }
    }
    catch (Exception ex)
    {
        return $"Exception: {ex.Message}";
    }
}

// Model to encapsulate the base64 image data
public class CamImage
{
    public string imageDataBase64 { get; set; }
}
<HttpPost>
<Route("ReadBarCode")>
Public Function ReadBarCode(ByVal imageData As CamImage) As String
	Try
		' Decode the base64 image data
		Dim splitObject = imageData.imageDataBase64.Split(","c)
		Dim imagebyteData() As Byte = Convert.FromBase64String(If(splitObject.Length > 1, splitObject(1), splitObject(0)))

		' Set IronBarcode license key (replace 'Key' with actual key)
		IronBarCode.License.LicenseKey = "Key"

		Using ms = New MemoryStream(imagebyteData)
			' Convert byte array to Image
			Dim barcodeImage As Image = Image.FromStream(ms)
			' Read barcode from Image
			Dim result = BarcodeReader.Read(barcodeImage)
			If result Is Nothing OrElse result.Value Is Nothing Then
				Return $"{DateTime.Now}: Barcode is Not Detected"
			End If

			Return $"{DateTime.Now}: Barcode is ({result.Value})"
		End Using
	Catch ex As Exception
		Return $"Exception: {ex.Message}"
	End Try
End Function

' Model to encapsulate the base64 image data
Public Class CamImage
	Public Property imageDataBase64() As String
End Class
$vbLabelText   $csharpLabel

您可以在這裡找到範例專案。

常見問題解答

如何在 Blazor 專案中整合條碼庫?

要將條碼庫整合到 Blazor 項目中,請安裝相應的 NuGet 包,設置 Blazor 伺服器項目,使用 JavaScript 啟用網絡攝像頭支持,捕獲圖像,並使用該庫的條碼讀取方法對其進行解碼。

如何在 Blazor 應用程式中啟用相機支援?

透過在 Blazor 專案中新增 JavaScript 檔案來啟用攝影機支援。該檔案應包含用於存取和傳輸攝影機視訊的函數,這些函數可以透過 JS 互通從 Blazor 中呼叫。

存取網路攝影機需要哪些 JavaScript 程式碼?

JavaScript 程式碼應包含一個類似initializeCamera()的函數,該函數使用navigator.mediaDevices.getUserMedia請求存取攝影機並將視訊串流傳輸到 HTML 視訊元素。

如何在 Blazor 中擷取和處理來自網路攝影機的畫面?

編寫一個 JavaScript 函數,用於捕獲當前視訊幀,將其轉換為 base64 編碼的圖像,並使用 Blazor 的 JS 互通性將其發送到 C# 方法。然後,C# 方法可以處理該圖像以讀取條碼。

如何在 Blazor 專案中讀取條碼?

你可以使用條碼庫的讀取器類,透過伺服器端 API 方法解碼 base64 圖像字串來讀取條碼,該方法可以從圖像中提取條碼值。

在 Blazor 中使用條碼庫有哪些先決條件?

請確保您已設定 Blazor 伺服器專案、安裝了必要的 NuGet 套件,並且已配置 JavaScript 以處理網路攝影機輸入。您還需要條碼庫的有效許可證金鑰。

如何在 Blazor 中將擷取的影像傳送到伺服器?

使用 JavaScript 中的DotNetObjectReference呼叫 C# 方法,並將擷取的影像傳送到伺服器,該方法使用 base64 影像字串呼叫該方法。

這個條碼庫可以處理二維碼嗎?

是的,條碼庫可以在 .NET 應用程式(包括使用 Blazor 建置的應用程式)中建立、讀取和管理條碼和二維碼。

哪裡可以找到使用條碼庫的 Blazor 專案範例?

文章結論部分提供的連結提供了一個使用條碼庫的 Blazor 專案範例供下載。

Curtis Chau
技術作家

Curtis Chau 擁有卡爾頓大學計算機科學學士學位,專注於前端開發,擅長於 Node.js、TypeScript、JavaScript 和 React。Curtis 熱衷於創建直觀且美觀的用戶界面,喜歡使用現代框架並打造結構良好、視覺吸引人的手冊。

除了開發之外,Curtis 對物聯網 (IoT) 有著濃厚的興趣,探索將硬體和軟體結合的創新方式。在閒暇時間,他喜愛遊戲並構建 Discord 機器人,結合科技與創意的樂趣。

準備好開始了嗎?
Nuget 下載 1,935,276 | 版本: 2025.11 剛剛發布