Jak korzystać ze skanera BarCode w Blazor | IronBarcode

Korzystanie z IronBarcode w Blazorze

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

Ten artykuł instruktażowy zawiera szczegółowe wskazówki dotyczące integracji IronBarcode z projektem Blazor. Jako przykład wykorzystamy IronBarcode w aplikacji Blazor do skanowania kodów kreskowych/QR uchwyconych przez kamerę internetową użytkownika.

Utwórz projekt Blazor

Otwórz Visual Studio => Utwórz nowy projekt => Aplikacja serwerowa Blazor:

CreateBlazorProject related to Utwórz projekt Blazor

Ustal nazwę i lokalizację projektu:

ProjectName related to Utwórz projekt Blazor

Wybierz platformę .NET Framework 6 (lub dowolną inną nowoczesną wersję .NET Standard):

SelectFramework related to Utwórz projekt Blazor

I gotowi:

MainScreen related to Utwórz projekt Blazor

Aby dodać obsługę kamery internetowej, dodaj nowy komponent Razor:

NewRazorComponent related to Utwórz projekt Blazor

Nadaj mu nazwę, a następnie kliknij Dodaj:

NewRazorComponentName related to Utwórz projekt Blazor

Włączanie funkcji kamery internetowej za pomocą JavaScript

Ponieważ ta aplikacja współpracuje z kamerą internetową użytkownika, ze względu na prywatność powinna obsługiwać dane po stronie klienta. Dodaj plik JavaScript do projektu, aby obsłużył funkcjonalność kamerki internetowej i nazwij go webcam.js:

JavascriptFileLocation related to Włączanie funkcji kamery internetowej za pomocą JavaScript

Nie zapomnij o dodaniu referencji do webcam.js w index.html:

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

Dodaj poniższy kod do 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

Musimy uruchomić kamerę internetową użytkownika. Zrób to, gdy strona się załadowuje, nadpisując metodę OnInitializedAsync() klasy Index.razor. Wywołaj funkcję JavaScript initializeCamera(), którą napisałeś wcześniej.

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

Teraz dodaj tagi HTML, które uruchomią strumień wideo z kamery internetowej:

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

Uchwyć obraz

Aby uchwycić klatkę z obrazu kamerki internetowej, napiszmy kolejną funkcję JavaScript w webcam.js. Ta funkcja narysuje bieżącą klatkę z filmu źródłowego na obszarze docelowym.

// 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

Funkcja ta uchwyci klatkę, zakoduje ją w base64, a następnie wyśle zakodowany obraz do metody w C# o nazwie ProcessImage(). Metoda ProcessImage() wygląda następująco: wysyła zakodowany obraz do API po stronie serwera w celu jego przetworzenia.

[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

Obsługuje ona wysyłanie zakodowanego obrazu z getFrame() w JavaScript do API po stronie serwera w celu przetworzenia.

Następnie musimy wywołać tę funkcję JavaScript po kliknięciu przycisku Capture Frame. Pamiętaj, nasz przycisk szuka funkcji obsługi o nazwie 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 – wyodrębnianie uchwyconego obrazu

Dodaj pakiet IronBarcode NuGet do projektu serwera:

dotnet add package IronBarCode

Teraz w projekcie serwera dodaj metodę API do przetwarzania zakodowanego obrazu i wyodrębniania wartości BarCode/QR. Poniższy kod dodaje funkcję odczytu kodów kreskowych do projektu Blazor. Ze zeskanowanego obrazu wykonujemy wstępne przetwarzanie obrazu, a następnie przekazujemy go do metody FromStream. Przekaż obiekt Image do metody w klasie BarcodeReader, aby zeskanować kod kreskowy w Blazor. Wynikowa wartość kodu kreskowego jest następnie dostępna za pośrednictwem właściwości Value obiektu BarCodeResult.

[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

Przykładowy projekt można znaleźć tutaj.

Często Zadawane Pytania

Jak zintegrować bibliotekę kodów kreskowych z projektem Blazor?

Aby zintegrować bibliotekę kodów kreskowych z projektem Blazor, zainstaluj odpowiedni pakiet NuGet, skonfiguruj projekt serwera Blazor, włącz obsługę kamery internetowej za pomocą JavaScript, przechwytuj obrazy i dekoduj je przy użyciu metod odczytu kodów kreskowych biblioteki.

Jak włączyć obsługę kamery internetowej w aplikacji Blazor?

Włącz obsługę kamery internetowej, dodając plik JavaScript do swojego projektu Blazor. Plik powinien zawierać funkcje umożliwiające dostęp do obrazu z kamery internetowej i jego strumieniowanie, które można wywołać z Blazor za pomocą interopu JS.

Jaki kod JavaScript jest potrzebny, aby uzyskać dostęp do kamery internetowej?

Kod JavaScript powinien zawierać funkcję typu initializeCamera(), która wykorzystuje navigator.mediaDevices.getUserMedia do uzyskania dostępu do kamery i przesyłania strumienia wideo do elementu wideo HTML.

Jak przechwycić i przetworzyć klatkę z kamery internetowej w Blazorze?

Napisz funkcję JavaScript, która przechwytuje bieżącą klatkę wideo, konwertuje ją na obraz zakodowany w base64 i wysyła do metody C# przy użyciu interoperacyjności JS w Blazorze. Metoda C# może następnie przetworzyć obraz w celu odczytania kodu BARCODE.

Jak odczytać kody kreskowe w projekcie Blazor?

BARCODE można odczytać poprzez dekodowanie ciągu obrazu base64 w metodzie API po stronie serwera przy użyciu klasy czytnika biblioteki BARCODE, która wyodrębnia wartość kodu BARCODE z obrazu.

Jakie są wymagania wstępne dotyczące korzystania z biblioteki kodów kreskowych w Blazorze?

Upewnij się, że masz skonfigurowany projekt serwera Blazor, zainstalowany niezbędny pakiet NuGet oraz skonfigurowany JavaScript do obsługi danych z kamery internetowej. Potrzebny jest również ważny klucz licencyjny do biblioteki BarCode.

Jak wysłać przechwycone obrazy na serwer w Blazorze?

Wyślij przechwycone obrazy na serwer, wywołując metodę C# z danymi obrazu przy użyciu DotNetObjectReference w JavaScript, która wywołuje metodę z ciągiem obrazu w formacie base64.

Czy ta biblioteka BarCode obsługuje kody QR?

Tak, biblioteka kodów kreskowych umożliwia tworzenie, odczytywanie i zarządzanie zarówno kodami kreskowymi, jak i kodami QR w aplikacjach .NET, w tym w tych zbudowanych przy użyciu Blazor.

Gdzie mogę znaleźć przykładowy projekt Blazor wykorzystujący bibliotekę BARCODE?

Przykładowy projekt Blazor wykorzystujący bibliotekę BarCode można pobrać, klikając link podany w sekcji podsumowania artykułu.

Curtis Chau
Autor tekstów technicznych

Curtis Chau posiada tytuł licencjata z informatyki (Uniwersytet Carleton) i specjalizuje się w front-endowym rozwoju, z ekspertką w Node.js, TypeScript, JavaScript i React. Pasjonuje się tworzeniem intuicyjnych i estetycznie przyjemnych interfejsów użytkownika, Curtis cieszy się pracą z nowoczesnymi frameworkami i tworzeniem dobrze zorganizowanych, atrakcyjnych wizualnie podrę...

Czytaj więcej
Gotowy, aby rozpocząć?
Nuget Pliki do pobrania 2,145,441 | Wersja: 2026.4 just released
Still Scrolling Icon

Wciąż przewijasz?

Czy chcesz szybko dowodu? PM > Install-Package BarCode
uruchom przykład zobacz, jak twoje ciągi zamieniają się w kody kreskowe.