跳至頁尾內容
使用 IRONBARCODE

如何建立 Blazor 二維碼掃描器

本文探討如何使用 .NET 函式庫 IronQR 將快速回應程式碼掃描器(QR 程式碼掃描器)整合到 Blazor 應用程式中。 二維碼是一種二維條碼,可以儲存比普通一維條碼多得多的資料。

Blazor 是微軟的一個框架,它允許開發人員建立單頁應用程式(使用 Blazor WebAssembly 應用程式),或使用 C# 建立互動式 Web 介面(Blazor Server,我們將在本指南中重點介紹它)。

IronQR 與 Blazor Server 的整合用於二維碼掃描,是一種充分利用兩種技術優勢的策略組合。 透過將 IronQR 與 Blazor 應用程式集成,您可以有效地處理二維碼的生成和掃描。 二維碼閱讀器的這項功能在各種商業環境中越來越受歡迎,例如庫存管理、票務系統和非接觸式資訊共享。

了解基礎知識

什麼是 Blazor 伺服器?

Blazor Server是 ASP.NET Core 平台的一部分,是一個 Web 應用程式框架。 它使開發人員能夠使用 C# 而不是 JavaScript 建立互動式 Web 使用者介面。 此伺服器端模型透過 SignalR 連接處理用戶互動來運行,從而提供即時網路功能。 這有助於開發者創建高效且互動性強的網頁應用程式。

IronQR簡介

IronQR是一個 .NET 函式庫,其突出之處在於能夠高精度地讀取、解釋和產生二維碼。 它提供了一系列功能,包括處理不同類型的二維碼內容的功能。 IronQR 的優勢在於其簡單易用,可以輕鬆整合到 .NET 應用程式中,因此對於希望整合和建立二維碼功能的開發人員來說,IronQR 是一個不錯的選擇。

如何建立 Blazor 二維碼掃描器

  1. 在 Visual Studio Code 中建立 Blazor 伺服器應用程式
  2. 使用 NuGet 套件管理器安裝二維碼類別庫
  3. 在 index.razor 檔案中使用 HTML 和 CSS 建立使用者介面
  4. 寫上傳文件處理邏輯
  5. 使用 QR 函式庫編寫 QR 掃描邏輯。
  6. 在文字方塊中顯示結果

建立環境

建立一個新的 Blazor 伺服器應用程式

啟動 Visual Studio,選擇"建立新專案"。在專案範本選擇畫面中,找到並選擇"Blazor 伺服器應用程式"範本。 點選"下一步"。

如何建立 Blazor 二維碼掃描器:圖 1 - 找到要實現的正確模板

選擇範本後,輸入項目名稱和地點(其他所有選項保持預設值),然後按一下"下一步"按鈕。

如何建立 Blazor 二維碼掃描器:圖 2 - 設定項目詳情

現在選擇所需的 .NET Framework,然後點選建立按鈕。 它將創建一個 Blazor Server 應用程式。

如何建立 Blazor 二維碼掃描器:圖 3 - 選擇 .NET Framework 並建立項目

安裝 IronQR 庫

點選選單列中的"工具"。 從下拉式選單中選擇 NuGet 套件管理器。 從上下文功能表中,選擇"管理解決方案的 NuGet 套件"。 這將開啟 NuGet 套件管理器標籤。

如何建立 Blazor 二維碼掃描器:圖 4 - 存取 NuGet 套件管理器

在 NuGet 套件管理員中,在"瀏覽"標籤中搜尋"IronQR"。 然後在清單中找到"IronQR"軟體包。點擊"安裝"按鈕。

如何建立 Blazor 二維碼掃描器:圖 5 - 透過"瀏覽"標籤安裝 IronQR 軟體包

現在所有裝置都已安裝完畢,我們可以一起查看專案結構,並將所有內容整合到您的專案中。

實作二維碼掃描

建構使用者介面

二維碼掃描器的使用者介面主要建構於Index.razor檔案中。該檔案是 Blazor 伺服器專案的一部分,它結合了 HTML 和 Razor 語法來建立動態互動網頁。 該結構包括:

@page "/"
@using System.IO
@using Microsoft.AspNetCore.Components.Forms
@using IronQr
@using IronSoftware.Drawing
@inject IJSRuntime JSRuntime
<PageTitle>QR Code Scanner</PageTitle>
<div>
    <h1>QR Code Scanner</h1> 
    <InputFile OnChange="HandleSelectedFile" accept="image/*" class="file-input" />
    @if (!string.IsNullOrEmpty(qrImageSrcForDisplay))
    {
        <img src="@qrImageSrcForDisplay" alt="QR Code Image" class="qr-image" />
    }
    <button @onclick="ScanQRCode" disabled="@(!fileSelected)" class="button scan-button">Scan QR Code</button>
    @if (!string.IsNullOrEmpty(scannedText))
    {
        <div class="result-section">
            <input type="text" value="@scannedText" readonly class="result-input" />
            <button @onclick="CopyToClipboard" class="button copy-button">Copy</button>
        </div>
    }
</div>

標題和標題:<PageTitle><h1>標籤分別定義頁面標題和主標題,為使用者設定上下文。

圖片上傳控制:一個<InputFile>此元件用於上傳二維碼圖像。 此元素僅接受影像文件,透過過濾掉不相關的文件類型來提升使用者體驗。

圖片顯示:圖片上傳後,會使用以下方式顯示:<img>標籤。 這種視覺回饋對於確保用戶上傳的檔案正確至關重要。

掃描按鈕:帶有@onclick=&quot;ScanQRCode&quot;標籤的按鈕會觸發掃描過程。 其可用性取決於是否選擇了文件,從而增強了介面的直覺性。

結果顯示:掃描的二維碼文字將顯示在文字輸入欄位中,方便查看。 使用者可以透過另一個按鈕將此文字複製到剪貼簿。

site.css 中的 CSS 樣式

二維碼掃描器的視覺美感和佈局在site.css檔案中定義。

.content {
    padding: 20px;
    margin: 10px auto; /* Centers the content */
    max-width: 500px; /* Sets a max width for the content */
    border-radius: 10px;
    box-shadow: 0 2px 4px rgba(0,0,0,0.2);
    text-align: center;
}

.file-input, .result-input {
    margin: 10px 0;
    padding: 10px;
    border-radius: 5px;
    border: 1px solid #ddd;
    width: 100%;
}

.button {
    background-color: #4CAF50;
    color: white;
    border: none;
    cursor: pointer;
    padding: 10px;
    margin: 10px 0;
    border-radius: 5px;
    transition: background-color 0.3s, box-shadow 0.3s;
    width: auto; /* Adjusts button width */
    display: inline-block; /* Allows the width to adjust to content */
}

.button:hover {
    background-color: #45a049;
    box-shadow: 0 4px 8px rgba(0,0,0,0.2);
} 

.qr-image {
    max-width: 300px;
    max-height: 300px;
    display: block;
    margin: 10px auto;
    border-radius: 10px;
}

.result-section {
    display: flex;
    flex-direction: column;
    align-items: center;
    width: 100%;
}

.result-input {
    width: 100%;
    box-sizing: border-box;
}

.copy-button {
    margin-top: 10px;
    white-space: nowrap;
}

.content此類別用於設定主要內容區域的樣式,賦予其定義的寬度、居中對齊方式以及微妙的陰影以增加深度。

.file-input, .result-input這些類別設定檔輸入和結果顯示元素的樣式,確保它們在視覺上保持一致,並完全佔據容器的寬度。

.button按鈕採用獨特的綠色背景、圓角和懸停效果,以提高使用者互動體驗。

.qr-image套用於二維碼影像的樣式包括尺寸限制和自動居中邊距,使影像突出但不至於過於醒目。

.result-section此功能確保結果部分中的元素居中對齊並適當間距。

處理文件上傳

HandleSelectedFile方法是二維碼掃描過程中的關鍵部分,用於處理使用者上傳的檔案並準備進行掃描。 當使用者透過以下方式選擇檔案時,將觸發此方法:<InputFile>成分。 以下程式碼展示了這一點:

private async Task HandleSelectedFile(InputFileChangeEventArgs e)
{
    selectedFile = e.File;
    fileSelected = true;
    var imagesDirectory = Path.Combine(Directory.GetCurrentDirectory(), "UploadedImages");
    Directory.CreateDirectory(imagesDirectory); // Ensure the directory exists

    // Use a GUID as the unique file name
    var uniqueFileName = Guid.NewGuid().ToString() + Path.GetExtension(selectedFile.Name);
    var fullPath = Path.Combine(imagesDirectory, uniqueFileName);

    await using (var fileStream = new FileStream(fullPath, FileMode.Create))
    {
        await selectedFile.OpenReadStream().CopyToAsync(fileStream);
    }

    // Store the full path in qrImageSrc for scanning
    qrImageSrc = fullPath;

    // Optionally, create a base64 string for displaying the image (if needed)
    byte[] imageBytes = await File.ReadAllBytesAsync(fullPath);
    var base64String = Convert.ToBase64String(imageBytes);
    qrImageSrcForDisplay = $"data:image/{Path.GetExtension(selectedFile.Name).TrimStart('.')};base64,{base64String}";
}
private async Task HandleSelectedFile(InputFileChangeEventArgs e)
{
    selectedFile = e.File;
    fileSelected = true;
    var imagesDirectory = Path.Combine(Directory.GetCurrentDirectory(), "UploadedImages");
    Directory.CreateDirectory(imagesDirectory); // Ensure the directory exists

    // Use a GUID as the unique file name
    var uniqueFileName = Guid.NewGuid().ToString() + Path.GetExtension(selectedFile.Name);
    var fullPath = Path.Combine(imagesDirectory, uniqueFileName);

    await using (var fileStream = new FileStream(fullPath, FileMode.Create))
    {
        await selectedFile.OpenReadStream().CopyToAsync(fileStream);
    }

    // Store the full path in qrImageSrc for scanning
    qrImageSrc = fullPath;

    // Optionally, create a base64 string for displaying the image (if needed)
    byte[] imageBytes = await File.ReadAllBytesAsync(fullPath);
    var base64String = Convert.ToBase64String(imageBytes);
    qrImageSrcForDisplay = $"data:image/{Path.GetExtension(selectedFile.Name).TrimStart('.')};base64,{base64String}";
}
$vbLabelText   $csharpLabel

以下是其功能的詳細說明:

文件選擇和驗證:當使用者上傳文件時,該方法使用InputFileChangeEventArgs e捕獲文件的詳細資訊。 然後將selectedFile變數賦值給該文件,並將布林值fileSelected設為 true,表示輸入資料/文件已準備好進行處理。

建立檔案路徑:此方法準備一個目錄來儲存上傳的映像。 它使用Path.Combine建立指向"UploadedImages"目錄的路徑,並使用Directory.CreateDirectory確保目錄存在。 這一步驟對於有系統地整理上傳的文件至關重要。

產生唯一檔案名稱:為避免與現有檔案衝突,使用 GUID(全域唯一識別碼)附加到原始檔案副檔名來產生唯一檔案名稱。 這樣可以確保每個上傳的檔案都有唯一的識別。

儲存檔案:然後將檔案儲存到伺服器。 此方法建立一個指向新產生的檔案路徑的檔案流,並使用await selectedFile.OpenReadStream().CopyToAsync(fileStream)將上傳檔案的內容複製到此流中。 此步驟完成上傳過程。

準備顯示影像:檔案儲存後,需要將影像顯示給使用者進行確認。 該方法將檔案讀取到位元組數組中,並將其轉換為 base64 字串,以便直接嵌入到文字中。<img>標籤的src屬性。 這種轉換方式使得無需單獨向伺服器請求影像檔案即可顯示影像。

掃描二維碼

ScanQRCode方法是 Blazor Server 應用程式中二維碼掃描功能的核心。 此方法會取得上傳的圖像,並使用 IronQR 提取二維碼資料。

private async Task ScanQRCode()
{
    // Check if there is a valid image to work with
    if (string.IsNullOrEmpty(qrImageSrc)) return;

    try
    {
        var inputBmp = AnyBitmap.FromFile(qrImageSrc);
        QrImageInput imageInput = new QrImageInput(inputBmp);
        QrReader reader = new QrReader();
        IEnumerable<QrResult> results = reader.Read(imageInput);

        // Check if there are any results and if the first result contains text
        var firstResult = results.FirstOrDefault();
        if (firstResult != null && !string.IsNullOrWhiteSpace(firstResult.Value.ToString()))
        {
            scannedText = firstResult.Value.ToString();
        }
        else
        {
            scannedText = "QR value not found!";
        }
    }
    catch (Exception ex)
    {
        scannedText = "Error scanning QR code: " + ex.Message;
    }
}
private async Task ScanQRCode()
{
    // Check if there is a valid image to work with
    if (string.IsNullOrEmpty(qrImageSrc)) return;

    try
    {
        var inputBmp = AnyBitmap.FromFile(qrImageSrc);
        QrImageInput imageInput = new QrImageInput(inputBmp);
        QrReader reader = new QrReader();
        IEnumerable<QrResult> results = reader.Read(imageInput);

        // Check if there are any results and if the first result contains text
        var firstResult = results.FirstOrDefault();
        if (firstResult != null && !string.IsNullOrWhiteSpace(firstResult.Value.ToString()))
        {
            scannedText = firstResult.Value.ToString();
        }
        else
        {
            scannedText = "QR value not found!";
        }
    }
    catch (Exception ex)
    {
        scannedText = "Error scanning QR code: " + ex.Message;
    }
}
$vbLabelText   $csharpLabel

首先,此方法會檢查儲存上傳影像路徑的qrImageSrc變數是否為空。 此檢查可確保在繼續操作之前,存在有效的影像可供使用。

一旦確認影像已準備好進行處理,該方法就會繼續執行二維碼讀取的核心功能。 這包括幾個關鍵步驟,首先是將圖像從其儲存位置載入為適合二維碼分析的格式。 AnyBitmap.FromFile(qrImageSrc)方法可以實現這種轉換,該方法為掃描過程準備影像。

下一步是建立QrReader物件。 該物件是 IronQR 庫不可或缺的一部分,是解碼影像中二維碼的主要工具。 QrReader實例準備好後,應用程式將繼續掃描上傳的影像。 reader.Read(imageInput)函數負責執行此操作,它會有條不紊地搜尋影像中的二維碼並提取其資料。

掃描結果儲存在IEnumerable<QrResult>IEnumerable<QrResult>收藏。 然後仔細檢查該集合,找出第一個二維碼結果。 如果偵測到二維碼,且二維碼包含可讀文本,則擷取該文字並將其儲存在scannedText變數中。 但是,在找不到二維碼或二維碼不包含文字的情況下,應用程式會設定預設訊息,告知使用者未偵測到二維碼值。

成功掃描二維碼後,由於 Blazor 的雙向資料綁定功能,文字字串將顯示在文字輸入欄位中。 這是透過將scannedText變數綁定到文字輸入元素來實現的。 輸入欄位已設定為停用狀態,變成唯讀。 這種設計選擇著重於使用者查看結果並複製它,而不是編輯內容。

整個掃描過程都包含在 try-catch 區塊中,以防止掃描操作過程中出現任何意外錯誤。 這可能包括與影像檔案格式相關的問題,或讀取過程中出現的意外錯誤。 如果發生異常,則會捕獲該異常,並產生錯誤訊息顯示給使用者。 這種方法有助於追蹤問題,同時保持對使用者的透明度,從而提高應用程式的可靠性。

複製結果

為了啟用複製到剪貼簿功能, _Host.cshtml檔案中定義了一個名為copyTextToClipboard的 JavaScript 函數。該腳本提供了一種簡單而有效的與剪貼簿互動的方式:

<script>
    function copyTextToClipboard(text) {
        navigator.clipboard.writeText(text).then(function () {
            console.log('Copying to clipboard was successful!');
        }, function (err) {
            console.error('Could not copy text: ', err);
        });
    }
</script>
<script>
    function copyTextToClipboard(text) {
        navigator.clipboard.writeText(text).then(function () {
            console.log('Copying to clipboard was successful!');
        }, function (err) {
            console.error('Could not copy text: ', err);
        });
    }
</script>
HTML

該函數接受一個文字參數,該參數是要複製的文字。 它使用navigator.clipboard.writeText方法,這是一種與剪貼簿互動的現代方法。 該方法因其簡單易用且符合網路標準而備受青睞。 它旨在複製成功後在控制台中記錄成功訊息,以幫助調試並確保流暢的功能。 如果發生錯誤,錯誤訊息會記錄到控制台,從而提供有關操作過程中遇到的任何問題的見解。

index.razor 的@code部分中的CopyToClipboard方法充當 Blazor 應用程式和 JavaScript 函數之間的橋樑。 使用者介面中的按鈕點擊會觸發此方法。 啟動後,它會使用 Blazor 的 JavaScript 互通功能來呼叫copyTextToClipboard JavaScript 函數。 scannedText作為參數傳遞給此函數,從而有效地將文字複製到使用者的剪貼簿。

private async Task CopyToClipboard()
{
    await JSRuntime.InvokeVoidAsync("copyTextToClipboard", scannedText);
}
private async Task CopyToClipboard()
{
    await JSRuntime.InvokeVoidAsync("copyTextToClipboard", scannedText);
}
$vbLabelText   $csharpLabel

執行應用程式

專案運行後,用戶將看到以下簡潔明了的介面。 初始螢幕顯著位置展示了二維碼掃描器模組。 此模組包含一個用於上傳二維碼圖像檔案的按鈕("選擇檔案"),以及另一個用於啟動掃描過程的按鈕("掃描二維碼")。 初始狀態下,未選擇任何文件,掃描區域為空白,等待使用者輸入。

如何建立 Blazor 二維碼掃描器:圖 6 - 專案初始執行結果

使用者使用"選擇檔案"按鈕選擇並上傳二維碼影像,此時會顯示所選檔案的名稱(例如,"qrvalue.png")。 上傳的二維碼會顯示在介面上的指定區域,向使用者確認影像已準備好進行掃描。

如何建立 Blazor 二維碼掃描器:圖 7 - 使用者輸入二維碼後的結果

用戶點擊"掃描二維碼"按鈕後,應用程式將處理影像。 如果掃描成功,二維碼中編碼的文字將顯示在圖像下方。 在這種情況下,掃描結果( &#39;<https://ironsoftware.com/csharp/qr/> &#39; ) 是一個 URL,指示使用 QR 閱讀器掃描 QR 碼時,使用者將被引導至何處。 結果旁邊會出現一個複製按鈕,方便使用者將掃描的文字複製到剪貼簿以供後續使用。

如何建立 Blazor 二維碼掃描器:圖 8 - 此圖顯示了二維碼中的文字和複製按鈕

結論

如何建立 Blazor 二維碼掃描器:圖 9

總而言之,將 IronQR 整合到 Blazor Server 應用程式的過程流暢有效,最終實現了二維碼掃描解決方案。 從專案設定開始到掃描功能的實現,反應迅速且易於使用,這得益於 IronQR 強大的處理能力與 Blazor 的動態 UI 渲染的結合。 從環境建構到部署,整個過程強調了這種整合在實際應用中的實用性和有效性。 雖然 IronQR 擅長處理二維碼,但對於需要掃描條碼功能的項目, IronBarcode是一個理想的選擇,它提供了類似的便利性和整合性。

IronQR 為開發者提供免費試用版,以便他們在購買前探索其各項功能。 如需在生產環境中擴展使用並存取其所有專業功能,IronQR 授權起價為$799 。

常見問題解答

如何將二維碼掃描器整合到 Blazor 應用程式中?

若要在 Blazor 應用程式中整合二維碼掃描器,可以使用 .NET 庫 IronQR。首先在 Visual Studio 中設定 Blazor 伺服器應用程序,然後透過 NuGet 套件管理器安裝 IronQR,並在 index.razor 檔案中建立使用者介面。使用 IronQR 實現文件處理和掃描邏輯,以掃描二維碼並顯示結果。

如何設定用於二維碼掃描的 Blazor Server 應用程式?

要設定用於二維碼掃描的 Blazor Server 應用程序,請在 Visual Studio 中建立一個新的 Blazor Server 應用程序,透過 NuGet 套件管理器安裝 IronQR,在 index.razor 檔案中使用 HTML 和 CSS 設計 UI,並編寫使用 IronQR 處理二維碼圖像的掃描邏輯。

IronQR 如何在 Blazor 應用程式中實現二維碼掃描?

IronQR 透過提供易於使用的二維碼讀取和生成方法,簡化了 Blazor 應用程式中的二維碼掃描功能。它與 .NET 應用程式無縫集成,使您能夠有效地實現二維碼掃描邏輯,並在 Web 介面上顯示掃描資料。

IronQR庫為二維碼處理提供了哪些功能?

IronQR 函式庫提供讀取、解析和產生二維碼的功能。它支援多種圖像格式,因此可以輕鬆整合到需要二維碼掃描或生成的應用程式中。該程式庫以其在 .NET 專案中的準確性和易用性而著稱。

我可以在 Blazor 應用程式中使用 IronQR 產生二維碼嗎?

是的,IronQR 可以用於在 Blazor 應用程式中產生二維碼。您可以將其整合到您的應用程式中,透過文字或 URL 建立二維碼,然後根據需要顯示或列印這些二維碼。

如何使用 IronQR 排查 Blazor 中二維碼掃描的問題?

若要排查 Blazor 中使用 IronQR 時遇到的二維碼掃描問題,請確保已透過 NuGet 套件管理器正確安裝 IronQR 庫,驗證影像檔案格式是否受支持,並檢查應用程式中實現的掃描邏輯是否有任何錯誤。查閱相關文件也可能提供更多資訊。

使用 Blazor Server 開發二維碼應用程式有哪些優點?

使用 Blazor Server 開發二維碼應用程式有許多優勢,包括能夠使用 C# 建立互動式 Web 介面、透過 SignalR 連接在伺服器端處理使用者交互,以及與 IronQR 等庫無縫整合以增強二維碼功能。

如何在 Blazor 應用程式中顯示二維碼掃描結果?

在 Blazor 應用程式中,您可以使用 IronQR 讀取二維碼數據,然後將結果輸出到使用者介面,從而顯示二維碼掃描結果。這可以透過更新頁面上的文字元素或顯示區域來實現,更新內容可以是掃描到的資訊。

柯蒂斯·週
技術撰稿人

Curtis Chau擁有卡爾頓大學電腦科學學士學位,專長於前端開發,精通Node.js、TypeScript、JavaScript和React。他熱衷於打造直覺美觀的使用者介面,喜歡使用現代框架,並擅長撰寫結構清晰、視覺效果出色的使用者手冊。

除了開發工作之外,柯蒂斯對物聯網 (IoT) 也抱有濃厚的興趣,致力於探索硬體和軟體整合的創新方法。閒暇時,他喜歡玩遊戲和製作 Discord 機器人,將他對科技的熱愛與創造力結合。