Jak dostosować prędkość czytania w języku C# za pomocą IronBarcode

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

IronBarcode zapewnia cztery opcje szybkości odczytu (Faster, Balanced, Detailed, ExtremeDetail), które pozwalają kontrolować kompromis między szybkością przetwarzania a dokładnością podczas odczytu kodów kreskowych w C#, z Balanced jako zalecanym punktem wyjścia dla większości aplikacji.

Wprowadzenie

Dokładność ma kluczowe znaczenie podczas odczytu dużych zbiorów BarCodes, ale równie ważne są kwestie alokacji zasobów i wydajności przetwarzania. Jakość obrazów wejściowych decyduje o tym, w jaki sposób czytnik kodów kreskowych powinien je przetwarzać — czy pominąć przetwarzanie wstępne w przypadku wyraźnych obrazów, czy też zastosować opcje wymagające większych zasobów w celu poprawy dokładności w przypadku kodów kreskowych o obniżonej jakości.

IronBarcode zapewnia elastyczność w wyborze szybkości przetwarzania i poziomu dokładności, umożliwiając kontrolę nad każdym aspektem procesu odczytu kodów kreskowych. Możesz podejmować decyzje na podstawie dostarczonych obrazów i dostępnych zasobów. W przypadku bardziej zaawansowanych scenariuszy odczytu BarCode zapoznaj się z naszym obszernym samouczkiem dotyczącym odczytu BarCode, który obejmuje różne formaty i techniki.

W tym artykule przedstawiono wytyczne dotyczące wyboru optymalnej prędkości czytania w różnych sytuacjach. Wykorzystamy przykłady kodów QR, aby zademonstrować, jak zmiana prędkości odczytu wpływa na wyniki. Jeśli pracujesz konkretnie z kodami QR, zapoznaj się z naszym samouczkiem dotyczącym generatora kodów QR w języku C#, aby utworzyć próbki testowe.

Szybki start: Odczyt BarCoda z wyważoną prędkością

Użyj BarcodeReaderOptions IronBarcode, aby natychmiast ustawić poziom Speed dla swojego skanu. Ten przykład pokazuje, jak szybko odczytywać kody kreskowe, używając ustawienia Balanced dla szybkich i niezawodnych wyników.

  1. Install IronBarcode with NuGet Package Manager

    PM > Install-Package BarCode
  2. Skopiuj i uruchom ten fragment kodu.

    var results = IronBarCode.BarcodeReader.Read("path/to/image.png", new IronBarCode.BarcodeReaderOptions { Speed = IronBarCode.ReadingSpeed.Balanced });
  3. Wdrożenie do testowania w środowisku produkcyjnym

    Rozpocznij używanie IronBarcode w swoim projekcie już dziś z darmową wersją próbną

    arrow pointer


Jakie są dostępne opcje prędkości czytania?

IronBarcode oferuje cztery opcje ReadingSpeed: Faster, Balanced, Detailed i ExtremeDetail. Przeanalizujemy każdą opcję, korzystając z zestawu przykładów zawierającego głównie zniekształcone obrazy BARCODE-ów oraz kilka wyraźnych obrazów, aby zademonstrować możliwości biblioteki. Pełną listę obsługiwanych formatów można znaleźć na naszej stronie poświęconej obsługiwanym formatom BarCode.

Wykorzystamy bibliotekę testów porównawczych .NET do pomiaru czasu przetwarzania i zużycia pamięci, pokazując porównanie poszczególnych opcji oraz identyfikując idealne scenariusze dla każdej prędkości odczytu. Przedstawimy kod testowy oraz prostą metodę zliczania poprawnie odczytanych uszkodzonych BARCODE-ów. Aby uzyskać więcej informacji na temat konfiguracji opcji czytnika, zapoznaj się z naszym przykładem ustawień czytnika BarCode.

Kiedy należy używać opcji szybszego tłumaczenia?

Opcja Faster zapewnia najszybszy odczyt kodów kreskowych przy minimalnych zasobach, ale zmniejsza dokładność. Proces ten pomija wstępne przetwarzanie obrazów i działa najlepiej, gdy obrazy wejściowe są już ostre i wyraźne.

Ten przykład ustawia właściwość Speed na ReadingSpeed.Faster, importuje katalog kodów kreskowych i drukuje znalezione kody kreskowe z ich wartościami, typami i liczbą na obraz. Aby lepiej zrozumieć odczytywanie BARCODE-ów z różnych formatów obrazów, zapoznaj się z naszym przewodnikiem dotyczącym odczytywania BARCODE-ów z obrazów.

:path=/static-assets/barcode/content-code-examples/how-to/reading-speed-option-faster.cs
using IronBarCode;
using System;
using System.Diagnostics;
using System.IO;
using System.Linq;

var optionsFaster = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.Faster
};

// Directory containing PDF files
string folderPath = @"YOUR_FILE_PATH";

// Get all PDF files in the directory
var pdfFiles = Directory.GetFiles(folderPath, "*.jpg");

int countFaster = 0;
var stopwatch = Stopwatch.StartNew();
foreach (var file in pdfFiles)
{
    // Read the barcode
    var results = BarcodeReader.Read(file, optionsFaster);

    if (results.Any())
    {
        Console.WriteLine($"Barcode(s) found in: {Path.GetFileName(file)}");
        foreach (var result in results)
        {
            Console.WriteLine($"  Value: {result.Value}, Type: {result.BarcodeType}");
            countFaster++;
        }
    }
    else
    {
        Console.WriteLine($"No barcode found in: {Path.GetFileName(file)}");
    }
}

stopwatch.Stop();

// Print number of images the barcode reader could decode
Console.WriteLine($"Faster could read = {countFaster} out of {pdfFiles.Length} in {stopwatch.ElapsedMilliseconds}ms");
Imports IronBarCode
Imports System
Imports System.Diagnostics
Imports System.IO
Imports System.Linq

Dim optionsFaster As New BarcodeReaderOptions With {
    .Speed = ReadingSpeed.Faster
}

' Directory containing PDF files
Dim folderPath As String = "YOUR_FILE_PATH"

' Get all PDF files in the directory
Dim pdfFiles = Directory.GetFiles(folderPath, "*.jpg")

Dim countFaster As Integer = 0
Dim stopwatch As Stopwatch = Stopwatch.StartNew()
For Each file In pdfFiles
    ' Read the barcode
    Dim results = BarcodeReader.Read(file, optionsFaster)

    If results.Any() Then
        Console.WriteLine($"Barcode(s) found in: {Path.GetFileName(file)}")
        For Each result In results
            Console.WriteLine($"  Value: {result.Value}, Type: {result.BarcodeType}")
            countFaster += 1
        Next
    Else
        Console.WriteLine($"No barcode found in: {Path.GetFileName(file)}")
    End If
Next

stopwatch.Stop()

' Print number of images the barcode reader could decode
Console.WriteLine($"Faster could read = {countFaster} out of {pdfFiles.Length} in {stopwatch.ElapsedMilliseconds}ms")
$vbLabelText   $csharpLabel

Opcja Faster wykryła 146 wyników kodów kreskowych z 430 w ciągu 25 sekund, osiągając 33,95% dokładności. Chociaż metoda ta jest szybka, nadaje się tylko do obrazów w idealnym stanie. W przypadku wielu BarCodes na jednym obrazie warto zapoznać się z naszym przewodnikiem dotyczącym odczytu wielu BarCodes, aby uzyskać optymalną konfigurację.

Dlaczego opcja "Zrównoważona" jest zalecaną opcją szybkości?

Opcja Balanced balansuje między dokładnością a wydajnością odczytu. IronBarcode stosuje lekkie przetwarzanie obrazu w celu wyostrzenia obszaru kodu kreskowego, ułatwiając jego wykrywanie i odczyt. To ustawienie jest zalecane dla większości współczesnych obrazów, ponieważ przetwarzanie w trybie jasnym zazwyczaj daje dokładne wyniki.

Użyjmy tych samych obrazów, aby pokazać, jak Balanced wpływa na wyniki wyjściowe. W przypadku operacji asynchronicznych zapoznaj się z naszym przewodnikiem dotyczącym asynchroniczności i wielowątkowości w IronBarcode.

:path=/static-assets/barcode/content-code-examples/how-to/reading-speed-option-balanced.cs
using IronBarCode;
using System;
using System.Diagnostics;
using System.IO;
using System.Linq;

var optionsFaster = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.Balanced
};

// Directory containing PDF files
string folderPath = @"YOUR_FILE_PATH";

// Get all PDF files in the directory
var pdfFiles = Directory.GetFiles(folderPath, "*.jpg");

int countFaster = 0;
var stopwatch = Stopwatch.StartNew();
foreach (var file in pdfFiles)
{
    // Read the barcode
    var results = BarcodeReader.Read(file, optionsFaster);

    if (results.Any())
    {
        Console.WriteLine($"Barcode(s) found in: {Path.GetFileName(file)}");
        foreach (var result in results)
        {
            Console.WriteLine($"  Value: {result.Value}, Type: {result.BarcodeType}");
            countFaster++;
        }
    }
    else
    {
        Console.WriteLine($"No barcode found in: {Path.GetFileName(file)}");
    }
}

stopwatch.Stop();

// Print number of images the barcode reader could decode
Console.WriteLine($"Balanced could read = {countFaster} out of {pdfFiles.Length} in {stopwatch.ElapsedMilliseconds}ms");
Imports IronBarCode
Imports System
Imports System.Diagnostics
Imports System.IO
Imports System.Linq

Dim optionsFaster As New BarcodeReaderOptions With {
    .Speed = ReadingSpeed.Balanced
}

' Directory containing PDF files
Dim folderPath As String = "YOUR_FILE_PATH"

' Get all PDF files in the directory
Dim pdfFiles = Directory.GetFiles(folderPath, "*.jpg")

Dim countFaster As Integer = 0
Dim stopwatch As Stopwatch = Stopwatch.StartNew()
For Each file In pdfFiles
    ' Read the barcode
    Dim results = BarcodeReader.Read(file, optionsFaster)

    If results.Any() Then
        Console.WriteLine($"Barcode(s) found in: {Path.GetFileName(file)}")
        For Each result In results
            Console.WriteLine($"  Value: {result.Value}, Type: {result.BarcodeType}")
            countFaster += 1
        Next
    Else
        Console.WriteLine($"No barcode found in: {Path.GetFileName(file)}")
    End If
Next

stopwatch.Stop()

' Print number of images the barcode reader could decode
Console.WriteLine($"Balanced could read = {countFaster} out of {pdfFiles.Length} in {stopwatch.ElapsedMilliseconds}ms")
$vbLabelText   $csharpLabel

Opcja Balanced wykryła 237 wyników kodów kreskowych z 430 w ciągu 43 sekund. Zapewnia 55,11% dokładności—znacznie lepszy wynik w porównaniu do Faster—przy tylko niewielkim zwiększeniu czasu. Ta opcja zapewnia optymalną równowagę między pamięcią a szybkością, dzięki czemu idealnie nadaje się do większości sytuacji i jest zalecanym punktem wyjścia. To wyważone podejście sprawdza się szczególnie dobrze w połączeniu z odpowiednimi technikami przetwarzania wstępnego obrazów.

Kiedy potrzebuję opcji szczegółowej szybkości?

Gdy obrazy są mocno rozmyte lub zniekształcone i Balanced nie może zapewnić wyraźnych wyników, użyj opcji Detailed. Stosuje średni poziom przetwarzania wstępnego w celu wyostrzenia obszaru BarCode i zredukowania szumu cyfrowego, co poprawia wykrywalność. W przypadku obrazów o bardzo niskiej jakości zapoznaj się z naszym przewodnikiem po korekcji obrazów, który obejmuje różne techniki przetwarzania wstępnego.

Zastosujmy ustawienie Detailed i zaobserwujmy jego wpływ na wyjście.

:path=/static-assets/barcode/content-code-examples/how-to/reading-speed-option-detailed.cs
using IronBarCode;
using System;
using System.Diagnostics;
using System.IO;
using System.Linq;

var optionsFaster = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.Detailed
};

// Directory containing PDF files
string folderPath = @"YOUR_FILE_PATH";

// Get all PDF files in the directory
var pdfFiles = Directory.GetFiles(folderPath, "*.jpg");

int countFaster = 0;
var stopwatch = Stopwatch.StartNew();
foreach (var file in pdfFiles)
{
    // Read the barcode
    var results = BarcodeReader.Read(file, optionsFaster);

    if (results.Any())
    {
        Console.WriteLine($"Barcode(s) found in: {Path.GetFileName(file)}");
        foreach (var result in results)
        {
            Console.WriteLine($"  Value: {result.Value}, Type: {result.BarcodeType}");
            countFaster++;
        }
    }
    else
    {
        Console.WriteLine($"No barcode found in: {Path.GetFileName(file)}");
    }
}

stopwatch.Stop();

// Print number of images the barcode reader could decode
Console.WriteLine($"Detailed could read = {countFaster} out of {pdfFiles.Length} in {stopwatch.ElapsedMilliseconds}ms");
Imports IronBarCode
Imports System
Imports System.Diagnostics
Imports System.IO
Imports System.Linq

Dim optionsFaster As New BarcodeReaderOptions With {
    .Speed = ReadingSpeed.Detailed
}

' Directory containing PDF files
Dim folderPath As String = "YOUR_FILE_PATH"

' Get all PDF files in the directory
Dim pdfFiles = Directory.GetFiles(folderPath, "*.jpg")

Dim countFaster As Integer = 0
Dim stopwatch As Stopwatch = Stopwatch.StartNew()
For Each file In pdfFiles
    ' Read the barcode
    Dim results = BarcodeReader.Read(file, optionsFaster)

    If results.Any() Then
        Console.WriteLine($"Barcode(s) found in: {Path.GetFileName(file)}")
        For Each result In results
            Console.WriteLine($"  Value: {result.Value}, Type: {result.BarcodeType}")
            countFaster += 1
        Next
    Else
        Console.WriteLine($"No barcode found in: {Path.GetFileName(file)}")
    End If
Next

stopwatch.Stop()

' Print number of images the barcode reader could decode
Console.WriteLine($"Detailed could read = {countFaster} out of {pdfFiles.Length} in {stopwatch.ElapsedMilliseconds}ms")
$vbLabelText   $csharpLabel

Opcja Detailed wykryła 237 wyników kodów kreskowych z 430 w ciągu 5 minut i 30 sekund. Jego 55,11% wskaźnik skuteczności w przypadku poważnie uszkodzonych BARCODE-ów świadczy o jego dokładności. Jednak ze względu na znacznie wydłużony czas przetwarzania opcja ta powinna być zarezerwowana wyłącznie dla obrazów BarCode o obniżonej jakości. W przypadku pracy z niedoskonałymi kodami kreskowymi zapoznaj się z naszym przykładem obsługi niedoskonałych kodów kreskowych, aby poznać dodatkowe strategie.

W jakich sytuacjach potrzebna jest szybkość ExtremeDetail?

Ustawienie ExtremeDetail stosuje intensywne przetwarzanie obrazów kodów kreskowych, znacznie zmniejszając wydajność odczytu. Ta opcja, wymagająca dużej mocy obliczeniowej procesora, sprawdza się najlepiej w przypadku skanowania wielu niewyraźnych lub zamazanych BARCODE-ów w jednym pliku wejściowym. Należy z niej korzystać w ostateczności, gdy inne opcje nie dają pożądanych rezultatów. W przypadku przetwarzania dużych ilości danych warto rozważyć odczytywanie BARCODE-ów z plików PDF, które często zawierają wiele BARCODE-ów na jednej stronie.

Zastosujmy ustawienie ExtremeDetail, aby zaobserwować jego wpływ.

:path=/static-assets/barcode/content-code-examples/how-to/reading-speed-option-extreme-detailed.cs
using IronBarCode;
using System;
using System.Diagnostics;
using System.IO;
using System.Linq;

var optionsFaster = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.ExtremeDetail
};

// Directory containing PDF files
string folderPath = @"YOUR_FILE_PATH";

// Get all PDF files in the directory
var pdfFiles = Directory.GetFiles(folderPath, "*.jpg");

int countFaster = 0;
var stopwatch = Stopwatch.StartNew();
foreach (var file in pdfFiles)
{
    // Read the barcode
    var results = BarcodeReader.Read(file, optionsFaster);

    if (results.Any())
    {
        Console.WriteLine($"Barcode(s) found in: {Path.GetFileName(file)}");
        foreach (var result in results)
        {
            Console.WriteLine($"  Value: {result.Value}, Type: {result.BarcodeType}");
            countFaster++;
        }
    }
    else
    {
        Console.WriteLine($"No barcode found in: {Path.GetFileName(file)}");
    }
}

stopwatch.Stop();

// Print number of images the barcode reader could decode
Console.WriteLine($"ExtremeDetail could read = {countFaster} out of {pdfFiles.Length} in {stopwatch.ElapsedMilliseconds}ms");
Imports IronBarCode
Imports System
Imports System.Diagnostics
Imports System.IO
Imports System.Linq

Dim optionsFaster As New BarcodeReaderOptions With {
    .Speed = ReadingSpeed.ExtremeDetail
}

' Directory containing PDF files
Dim folderPath As String = "YOUR_FILE_PATH"

' Get all PDF files in the directory
Dim pdfFiles = Directory.GetFiles(folderPath, "*.jpg")

Dim countFaster As Integer = 0
Dim stopwatch As Stopwatch = Stopwatch.StartNew()

For Each file In pdfFiles
    ' Read the barcode
    Dim results = BarcodeReader.Read(file, optionsFaster)

    If results.Any() Then
        Console.WriteLine($"Barcode(s) found in: {Path.GetFileName(file)}")
        For Each result In results
            Console.WriteLine($"  Value: {result.Value}, Type: {result.BarcodeType}")
            countFaster += 1
        Next
    Else
        Console.WriteLine($"No barcode found in: {Path.GetFileName(file)}")
    End If
Next

stopwatch.Stop()

' Print number of images the barcode reader could decode
Console.WriteLine($"ExtremeDetail could read = {countFaster} out of {pdfFiles.Length} in {stopwatch.ElapsedMilliseconds}ms")
$vbLabelText   $csharpLabel

Opcja ExtremeDetail zidentyfikowała 313 z 430 obrazów kodów kreskowych w około 10 minut. Chociaż osiąga imponującą dokładność na poziomie 72,79% w przypadku poważnie uszkodzonych BARCODE-ów, to ze względu na duże zużycie zasobów nadaje się do stosowania wyłącznie w ostateczności. Przed skorzystaniem z tej opcji warto rozważyć wstępne przetworzenie obrazów.

Jak wypadają różne prędkości w porównaniu?

Tryb Znalezione BarCodes Średni czas Czas na plik GC Pressure Zysk w zakresie dokładności
Szybciej 147/430 (33,95%) 25 s 0,058 s Wysoka (Gen2: 177K) Wersja wyjściowa
Zrównoważony 237/430 (55,11%) 43 s 0,1 s Wysoka (Gen2: 151 tys.) +62,32% w porównaniu z Faster
Szczegółowe 237/430 (55,11%) 5,50 min 0,767 s Bardzo wysoka (Gen2: 297 tys.) +0% vs Zrównoważone
ExtremeDetail 313/430 (72,79%) 10,14 min 1,414 s Extreme (Gen2: 4,74 mln) +32,08% w porównaniu ze szczegółowym

Jak wybrać odpowiednią prędkość dla mojej aplikacji?

Na podstawie powyższych porównań, zacznij od ustawienia Faster i przejdź przez Balanced, Detailed i ExtremeDetail, aby zidentyfikować znaczące różnice w wynikach wyjściowych. W większości przypadków Balanced radzi sobie z wszystkim wystarczająco dobrze. Używaj Detailed i ExtremeDetail tylko dla mocno zniekształconych obrazów. Dla cienkich lub niskiej jakości kodów kreskowych połącz ustawienie szybkości z MinScanLines = 1, aby zwiększyć czułość detekcji.

Chociaż Detailed i ExtremeDetail stosują średnie i ciężkie przetwarzanie, czasem bardziej efektywne jest podzielenie procesu—zastosuj filtry obrazu ręcznie przed odczytem kodu kreskowego zamiast używania jednego procesu. Więcej informacji na temat wstępnego przetwarzania obrazów można znaleźć w tym przewodniku.

Które ustawienie prędkości pasuje do mojego zastosowania?

Drzewo decyzyjne dotyczące wyboru prędkości próbkowania w oparciu o jakość obrazu, od opcji

Często Zadawane Pytania

Jakie są cztery dostępne opcje prędkości odczytu kodów kreskowych?

IronBarcode oferuje cztery opcje ReadingSpeed: Faster, Balanced, Detailed i ExtremeDetail. Każda z nich zapewnia inną równowagę między prędkością przetwarzania a dokładnością, z Balanced zalecanym jako domyślny punkt wyjścia dla większości aplikacji.

Jak ustawić prędkość odczytu podczas skanowania kodów kreskowych?

Prędkość odczytu można ustawić za pomocą klasy BarcodeReaderOptions w IronBarcode. Wystarczy stworzyć nowy obiekt BarcodeReaderOptions i ustawić właściwość Speed na wybraną wartość ReadingSpeed (Faster, Balanced, Detailed lub ExtremeDetail), a następnie przekazać go do metody Read.

Którą opcję prędkości odczytu powinienem użyć w mojej aplikacji?

IronBarcode zaleca rozpoczęcie od ustawienia Balanced dla większości aplikacji. Jeśli posiadasz wysokiej jakości, wyraźne obrazy kodów kreskowych, możesz użyć trybu Faster. Dla zniszczonych lub niskiej jakości obrazów rozważ użycie trybów Detailed lub ExtremeDetail w celu uzyskania lepszej dokładności.

Jaki jest kompromis między różnymi opcjami prędkości odczytu?

Kompromis w szybkościach odczytu w IronBarcode polega na prędkości przetwarzania i dokładności. Tryb Faster przetwarza obrazy szybko, ale może nie wykryć kodów kreskowych w niskiej jakości obrazach. Tryb ExtremeDetail zapewnia najwyższą dokładność, ale wymaga więcej czasu przetwarzania i zasobów pamięci.

Czy mogę odczytywać różne formaty kodów kreskowych z różnymi ustawieniami prędkości?

Tak, IronBarcode obsługuje odczyt różnych formatów kodów kreskowych, w tym kodów QR z wszystkimi ustawieniami prędkości. Ustawienie prędkości wpływa na podejście do przetwarzania, ale nie ogranicza typów kodów kreskowych, które można odczytać. Odwiedź stronę obsługiwanych formatów kodów kreskowych, aby poznać pełną listę.

Jak jakość obrazu wpływa na wybór prędkości odczytu?

Jakość obrazu bezpośrednio wpływa na wybór prędkości w IronBarcode. Wyraźne, wysokiej jakości obrazy kodów kreskowych mogą być przetwarzane wydajnie z trybem Faster. Zdegradowane, zamazane lub niskiego kontrastu obrazy wymagają trybów Detailed lub ExtremeDetail, aby zapewnić dokładne wykrywanie i odczyt kodów kreskowych.

Jaki jest minimalny przepływ pracy dla odczytu kodów kreskowych z opcjami prędkości?

Minimalny przepływ pracy z IronBarcode obejmuje 5 kroków: 1) Pobierz bibliotekę C#, 2) Użyj BarcodeReaderOptions, aby ustawić prędkość odczytu, 3) Wywołaj metodę Read z ścieżką do obrazu, 4) Wyodrębnij i wydrukuj wartości kodów kreskowych, 5) Oceń kompromisy wydajności między różnymi prędkościami.

Jak zmierzyć wpływ wydajności różnych prędkości odczytu?

Wydajność IronBarcode z różnymi prędkościami odczytu można zmierzyć przy użyciu bibliotek benchmarkowych .NET do śledzenia czasu przetwarzania i zużycia pamięci. Pomaga to zidentyfikować optymalne ustawienie prędkości dla twojego specyficznego przypadku użycia i ograniczeń zasobów.

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.