Jak odczytywać BarCodes ze strumieni w języku C#
Migracja z SDK barKoder do IronBarcode
Barkoder dostarcza oficjalne pakiety .NET — Plugin.Maui.Barkoder i Barkoder.Xamarin — jednak oba są ściśle mobilnymi komponentami do skanowania kamerą. Jeśli oceniałeś barKoder dla jego algorytmu MatrixSight, trybu DeBlur, wykrywania wielu kodów kreskowych lub wsparcia DPM, a następnie odkryłeś, że potrzebujesz wejścia plikowego, przetwarzania PDF, wdrożenia serwerowego lub generowania kodów kreskowych, żaden z nich nie jest dostępny w barKoder na .NET. Niniejszy przewodnik pokazuje, jak IronBarcode pokrywa każdy z tych wymagań, dostarczając działający kod dla każdego scenariusza.
Dlaczego migrować z SDK barKoder
Zespoły, które przechodzą z oceny barKoder na IronBarcode, konsekwentnie zgłaszają te same źródła motywacji:
Tylko powierzchnia aparatu mobilnego: Obszar .NET Barkoder to Plugin.Maui.Barkoder (v1.6.8, marzec 2026) i Barkoder.Xamarin (v1.3.0). Oba obejmują natywne SDK dla iOS / Androida i udostępniają kontrolkę kamerą BarkoderView. Brak jest uniwersalnej biblioteki Barkoder.NET, brak wsparcia dla ASP.NET Core, nie obsługują także celów konsolowych / roboczych / desktopowych oraz serwerów Linux.
Architektura tylko do odczytu: Barkoder to zestaw SDK przeznaczony wyłącznie do skanowania. Jeśli Twoja aplikacja wymaga generowania kodów kreskowych — drukowania etykiet wysyłkowych, tworzenia kodów QR na opakowaniach, osadzania kodów w dokumentach — Barkoder nie oferuje żadnych rozwiązań. Zespoły, które w trakcie projektu odkrywają potrzebę generowania kodu, potrzebują biblioteki, która obejmuje obie strony procesu.
Brak przetwarzania plików PDF: W aplikacjach Enterprise .NET BarCodes często pojawiają się w dokumentach PDF — fakturach, listach przewozowych, dokumentacji medycznej, dokumentach dotyczących zgodności. Barkoder nie ma pojęcia o tym przepływie pracy. Jest przeznaczony do obsługi obrazu z kamery na żywo na urządzeniu mobilnym i nie obsługuje plików PDF.
Brak wdrażania po stronie serwera: Model przetwarzania Barkoder opiera się na skanowaniu mobilnym na urządzeniu. Nie może działać w ASP.NET Core, Azure Functions, kontenerach Docker ani AWS Lambda. Zespoły tworzące serwerowe interfejsy API BarCode, potoki przetwarzania dokumentów lub funkcje w chmurze nie mają możliwości wdrożenia Barkoder.
Brak plikowego / strumieniowego wejścia: Nawet wewnątrz aplikacji MAUI, BarkoderView przetwarza jedynie klatki z kamery na żywo. Brak opcji ścieżki do pliku, tablicy bajtów lub przeciążenia Stream, więc przetwarzanie przesłanego obrazu lub zdjęcia z galerii wymaga innej biblioteki.
Podstawowa granica
Powierzchnia MAUI Barkodera jest związana z kamerą. Deweloper .NET używający Plugin.Maui.Barkoder pisze kod wyglądający następująco:
// dotnet add package Plugin.Maui.Barkoder
using Barkoder.Maui;
public partial class ScanPage : ContentPage, IBarkoderDelegate
{
public ScanPage()
{
InitializeComponent();
BarkoderView.SetFlashEnabled(false);
BarkoderView.StartScanning(this);
}
public void DidFinishScanning(BarcodeResult[] result)
{
foreach (var r in result)
Console.WriteLine($"{r.BarcodeTypeName}: {r.TextualData}");
}
}
// dotnet add package Plugin.Maui.Barkoder
using Barkoder.Maui;
public partial class ScanPage : ContentPage, IBarkoderDelegate
{
public ScanPage()
{
InitializeComponent();
BarkoderView.SetFlashEnabled(false);
BarkoderView.StartScanning(this);
}
public void DidFinishScanning(BarcodeResult[] result)
{
foreach (var r in result)
Console.WriteLine($"{r.BarcodeTypeName}: {r.TextualData}");
}
}
Imports Barkoder.Maui
Public Partial Class ScanPage
Inherits ContentPage
Implements IBarkoderDelegate
Public Sub New()
InitializeComponent()
BarkoderView.SetFlashEnabled(False)
BarkoderView.StartScanning(Me)
End Sub
Public Sub DidFinishScanning(result As BarcodeResult()) Implements IBarkoderDelegate.DidFinishScanning
For Each r In result
Console.WriteLine($"{r.BarcodeTypeName}: {r.TextualData}")
Next
End Sub
End Class
IronBarcode zapewnia API pliku/strumienia/PDF dla tych samych danych:
// dotnet add package BarCode
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.ExtremeDetail,
ExpectMultipleBarcodes = false,
};
var results = BarcodeReader.Read("scanned-label.png", options);
foreach (var result in results)
{
Console.WriteLine($"Format: {result.Format} | Value: {result.Value}");
}
// dotnet add package BarCode
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.ExtremeDetail,
ExpectMultipleBarcodes = false,
};
var results = BarcodeReader.Read("scanned-label.png", options);
foreach (var result in results)
{
Console.WriteLine($"Format: {result.Format} | Value: {result.Value}");
}
Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
Dim options As New BarcodeReaderOptions With {
.Speed = ReadingSpeed.ExtremeDetail,
.ExpectMultipleBarcodes = False
}
Dim results = BarcodeReader.Read("scanned-label.png", options)
For Each result In results
Console.WriteLine($"Format: {result.Format} | Value: {result.Value}")
Next
Porównanie funkcji: SDK IronBarcode vs barKoder
| Funkcja | SDK barKoder | IronBarcode |
|---|---|---|
| .NET / C# API | MAUI / Xamarin UI kamery tylko | Pełna powierzchnia .NET |
| Pakiet NuGet | Plugin.Maui.Barkoder, Barkoder.Xamarin |
BarCode |
| Odzyskiwanie uszkodzonych kodów BarCode | MatrixSight / DeBlur | ReadingSpeed.ExtremeDetail + ML |
| Wykrywanie wielu BarCodes | Tak | ExpectMultipleBarcodes = true |
| DataMatrix / DPM | Tak (tylko do odczytu) | Tak — przeczytaj i wygeneruj |
| Kod QR | Tak (tylko do odczytu) | Tak — przeczytaj i wygeneruj |
| PDF417 | Tak | Tak |
| Aztec | Tak | Tak |
| Code128, Code39, EAN | Tak | Tak — ponad 50 formatów |
| Generowanie kodów kreskowych | None | Pełna wersja — wszystkie formaty |
| Przetwarzanie plików PDF | None | Język ojczysty |
| Wejście pliku/strumienia/tablicy bajtów | Brak — tylko ramki kamery | Tak |
| ASP.NET Core | None | Pełna |
| Docker / Linux | None | Pełna |
| Azure Functions | None | Pełna |
| AWS Lambda | None | Pełna |
| Tryb offline / Air-Gapped | Na urządzeniu | W pełni zlokalizowane |
| Async / Await | Oparte na wywołaniach zwrotnych | Pełna |
| Wstrzykiwanie zależności | None | Pełna DI .NET |
| iOS poprzez MAUI | Plugin.Maui.Barkoder (interfejs użytkownika kamery) |
Programatyczne (plik/strumień) |
| Android poprzez MAUI | Plugin.Maui.Barkoder (interfejs użytkownika kamery) |
Programatyczne (plik/strumień) |
| Ceny | Roczna subskrypcja | Od 749 USD (licencja wieczysta) |
Szybki start: migracja z SDK barKoder do IronBarcode
Krok 1: Zastąp pakiet NuGet
Zainstaluj IronBarcode:
dotnet add package BarCode
Jeśli twój projekt używa Plugin.Maui.Barkoder lub Barkoder.Xamarin tylko dla przepływów bez kamery (lub przechodzisz całkowicie na przetwarzanie plików / PDF), usuń go:
dotnet remove package Plugin.Maui.Barkoder
dotnet remove package Plugin.Maui.Barkoder
Jeśli aplikacja nadal potrzebuje interfejsu użytkownika kamery na żywo, zachowaj Plugin.Maui.Barkoder i dodaj IronBarcode w celu pracy z plikami / PDF / generowaniem.
Krok 2: Aktualizacja przestrzeni nazw
Usuń przestrzeń nazw barKoder tam, gdzie nie jest już potrzebna, i dodaj przestrzeń nazw IronBarcode:
// Remove (if no longer needed)
// using Barkoder.Maui;
// Add
using IronBarCode;
// Remove (if no longer needed)
// using Barkoder.Maui;
// Add
using IronBarCode;
Imports IronBarCode
Krok 3: Inicjalizacja licencji
Dodaj inicjalizację licencji podczas uruchamiania aplikacji — w Program.cs dla ASP.NET Core, lub przed każdym działaniem na kodach kreskowych w aplikacjach konsolowych lub desktopowych:
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
Przykłady migracji kodu
Odczytywanie BarCodes z obrazów
Podstawowy scenariusz odczytu mapuje się z ramek kamery barKoder na API IronBarcode pliku/strumienia/tablicy bajtów.
Podejście barKoder MAUI:
// dotnet add package Plugin.Maui.Barkoder
using Barkoder.Maui;
public partial class ScanPage : ContentPage, IBarkoderDelegate
{
public ScanPage()
{
InitializeComponent();
BarkoderView.StartScanning(this);
}
public void DidFinishScanning(BarcodeResult[] result)
{
foreach (var r in result)
{
Console.WriteLine($"Barcode: {r.TextualData}");
Console.WriteLine($"Type: {r.BarcodeTypeName}");
}
}
}
// dotnet add package Plugin.Maui.Barkoder
using Barkoder.Maui;
public partial class ScanPage : ContentPage, IBarkoderDelegate
{
public ScanPage()
{
InitializeComponent();
BarkoderView.StartScanning(this);
}
public void DidFinishScanning(BarcodeResult[] result)
{
foreach (var r in result)
{
Console.WriteLine($"Barcode: {r.TextualData}");
Console.WriteLine($"Type: {r.BarcodeTypeName}");
}
}
}
Imports Barkoder.Maui
Public Partial Class ScanPage
Inherits ContentPage
Implements IBarkoderDelegate
Public Sub New()
InitializeComponent()
BarkoderView.StartScanning(Me)
End Sub
Public Sub DidFinishScanning(result As BarcodeResult()) Implements IBarkoderDelegate.DidFinishScanning
For Each r In result
Console.WriteLine($"Barcode: {r.TextualData}")
Console.WriteLine($"Type: {r.BarcodeTypeName}")
Next
End Sub
End Class
Podejście IronBarcode:
// dotnet add package BarCode
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
var results = BarcodeReader.Read("scan.png");
foreach (var result in results)
{
Console.WriteLine($"Format: {result.Format}");
Console.WriteLine($"Value: {result.Value}");
}
// dotnet add package BarCode
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
var results = BarcodeReader.Read("scan.png");
foreach (var result in results)
{
Console.WriteLine($"Format: {result.Format}");
Console.WriteLine($"Value: {result.Value}");
}
Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
Dim results = BarcodeReader.Read("scan.png")
For Each result In results
Console.WriteLine($"Format: {result.Format}")
Console.WriteLine($"Value: {result.Value}")
Next
Funkcja BarcodeReader.Read()IronBarcode automatycznie rozpoznaje format kodu kreskowego bez konieczności wcześniejszego jego określania. To samo wywołanie działa w przypadku obrazów przechwyconych przez urządzenie mobilne i przesłanych na serwer, obrazów załadowanych z systemu plików lub obrazów otrzymanych jako tablice bajtów ze strumienia. Aby uzyskać wyczerpujące informacje na temat odczytu, zapoznaj się z przewodnikiem odczytu IronBarcode.
Odzyskiwanie uszkodzonych BarCodes (odpowiednik trybu DeBlur)
Tryb DeBlur aplikacji Barkoder jest jedną z jej najczęściej wymienianych funkcji.IronBarcode zapewnia ekwiwalent dla wejścia plikowego przez ReadingSpeed.ExtremeDetail.
Podejście barKoder MAUI:
// Live camera scanning with DeBlur enabled via configuration
using Barkoder.Maui;
BarkoderView.SetEnabledBarcodeTypes(/* configure formats */);
BarkoderView.StartScanning(this);
public void DidFinishScanning(BarcodeResult[] result)
{
foreach (var r in result)
Console.WriteLine($"Recovered: {r.TextualData}");
}
// Live camera scanning with DeBlur enabled via configuration
using Barkoder.Maui;
BarkoderView.SetEnabledBarcodeTypes(/* configure formats */);
BarkoderView.StartScanning(this);
public void DidFinishScanning(BarcodeResult[] result)
{
foreach (var r in result)
Console.WriteLine($"Recovered: {r.TextualData}");
}
Imports Barkoder.Maui
' Live camera scanning with DeBlur enabled via configuration
BarkoderView.SetEnabledBarcodeTypes() ' configure formats
BarkoderView.StartScanning(Me)
Public Sub DidFinishScanning(result As BarcodeResult())
For Each r In result
Console.WriteLine($"Recovered: {r.TextualData}")
Next
End Sub
Podejście IronBarcode:
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.ExtremeDetail,
ExpectMultipleBarcodes = false,
};
var results = BarcodeReader.Read("worn-shipping-label.png", options);
if (results.Any())
{
Console.WriteLine($"Recovered barcode: {results.First().Value}");
}
else
{
Console.WriteLine("Could not decode — image quality too low");
}
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.ExtremeDetail,
ExpectMultipleBarcodes = false,
};
var results = BarcodeReader.Read("worn-shipping-label.png", options);
if (results.Any())
{
Console.WriteLine($"Recovered barcode: {results.First().Value}");
}
else
{
Console.WriteLine("Could not decode — image quality too low");
}
Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
Dim options As New BarcodeReaderOptions With {
.Speed = ReadingSpeed.ExtremeDetail,
.ExpectMultipleBarcodes = False
}
Dim results = BarcodeReader.Read("worn-shipping-label.png", options)
If results.Any() Then
Console.WriteLine($"Recovered barcode: {results.First().Value}")
Else
Console.WriteLine("Could not decode — image quality too low")
End If
ReadingSpeed.ExtremeDetail uruchamia opartą na ML linię analizy obrazu z wieloma porządkami, stosując korekcję kontrastu, wyostrzanie, korekcję rotacji i odzyskiwanie uszkodzeń przed próbą dekodowania. Dla przepływów wsadowych używaj ReadingSpeed.Balanced jako domyślnego i przejdź na ExtremeDetail tylko dla obrazów, których Balanced nie uda się dekodować.
Wykrywanie wielu BarCodes
Skanowanie wielu kodów kreskowych na klatkę przez Barkoder odpowiada opcji ExpectMultipleBarcodes w IronBarcode, która działa zarówno na obrazach, jak i na plikach PDF.
Podejście barKoder MAUI:
// Live camera frame returns BarcodeResult[]; multi-scan configured on the view
using Barkoder.Maui;
BarkoderView.StartScanning(this);
public void DidFinishScanning(BarcodeResult[] result)
{
foreach (var r in result)
Console.WriteLine($"{r.BarcodeTypeName}: {r.TextualData}");
}
// Live camera frame returns BarcodeResult[]; multi-scan configured on the view
using Barkoder.Maui;
BarkoderView.StartScanning(this);
public void DidFinishScanning(BarcodeResult[] result)
{
foreach (var r in result)
Console.WriteLine($"{r.BarcodeTypeName}: {r.TextualData}");
}
Imports Barkoder.Maui
BarkoderView.StartScanning(Me)
Public Sub DidFinishScanning(result As BarcodeResult())
For Each r In result
Console.WriteLine($"{r.BarcodeTypeName}: {r.TextualData}")
Next
End Sub
Podejście IronBarcode:
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true,
};
// Works identically on images and PDFs
var results = BarcodeReader.Read("shipping-manifest.pdf", options);
foreach (var barcode in results)
{
Console.WriteLine($"Page {barcode.PageNumber} | {barcode.Format} | {barcode.Value}");
}
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true,
};
// Works identically on images and PDFs
var results = BarcodeReader.Read("shipping-manifest.pdf", options);
foreach (var barcode in results)
{
Console.WriteLine($"Page {barcode.PageNumber} | {barcode.Format} | {barcode.Value}");
}
Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
Dim options As New BarcodeReaderOptions With {
.Speed = ReadingSpeed.Balanced,
.ExpectMultipleBarcodes = True
}
' Works identically on images and PDFs
Dim results = BarcodeReader.Read("shipping-manifest.pdf", options)
For Each barcode In results
Console.WriteLine($"Page {barcode.PageNumber} | {barcode.Format} | {barcode.Value}")
Next
Jest to pojedyncze wywołanie metody. Brak wyodrębniania stron, brak wielokrotnych żądań, brak obciążenia związanego z przetwarzaniem poszczególnych BarCode'ów. Plik PDF jest odczytywany natywnie.
Generowanie i odczytywanie kodów DataMatrix
Barkoder odczytuje kody DataMatrix, ale nie może ich generować.IronBarcode obejmuje obie strony procesu, co jest powszechnym wymogiem w przemysłowych systemach śledzenia.
Podejście barKoder MAUI:
// Camera-only DataMatrix scanning; no generation available
using Barkoder.Maui;
BarkoderView.StartScanning(this);
public void DidFinishScanning(BarcodeResult[] result)
{
foreach (var r in result)
Console.WriteLine($"Part ID: {r.TextualData}");
}
// Camera-only DataMatrix scanning; no generation available
using Barkoder.Maui;
BarkoderView.StartScanning(this);
public void DidFinishScanning(BarcodeResult[] result)
{
foreach (var r in result)
Console.WriteLine($"Part ID: {r.TextualData}");
}
Imports Barkoder.Maui
' Camera-only DataMatrix scanning; no generation available
BarkoderView.StartScanning(Me)
Public Sub DidFinishScanning(result As BarcodeResult())
For Each r In result
Console.WriteLine($"Part ID: {r.TextualData}")
Next
End Sub
Podejście IronBarcode:
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
// Generate a DataMatrix barcode for a part label
BarcodeWriter.CreateBarcode("PART-SN-20240315-A42291", BarcodeEncoding.DataMatrix)
.SaveAsPng("part-label.png");
// Read DataMatrix from a scanned industrial part image
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.ExtremeDetail,
ExpectMultipleBarcodes = false,
};
var results = BarcodeReader.Read("etched-part-photo.png", options);
foreach (var result in results)
{
Console.WriteLine($"Part Serial: {result.Value}");
Console.WriteLine($"Barcode Type: {result.Format}");
}
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
// Generate a DataMatrix barcode for a part label
BarcodeWriter.CreateBarcode("PART-SN-20240315-A42291", BarcodeEncoding.DataMatrix)
.SaveAsPng("part-label.png");
// Read DataMatrix from a scanned industrial part image
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.ExtremeDetail,
ExpectMultipleBarcodes = false,
};
var results = BarcodeReader.Read("etched-part-photo.png", options);
foreach (var result in results)
{
Console.WriteLine($"Part Serial: {result.Value}");
Console.WriteLine($"Barcode Type: {result.Format}");
}
Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
' Generate a DataMatrix barcode for a part label
BarcodeWriter.CreateBarcode("PART-SN-20240315-A42291", BarcodeEncoding.DataMatrix) _
.SaveAsPng("part-label.png")
' Read DataMatrix from a scanned industrial part image
Dim options As New BarcodeReaderOptions With {
.Speed = ReadingSpeed.ExtremeDetail,
.ExpectMultipleBarcodes = False
}
Dim results = BarcodeReader.Read("etched-part-photo.png", options)
For Each result In results
Console.WriteLine($"Part Serial: {result.Value}")
Console.WriteLine($"Barcode Type: {result.Format}")
Next
Pełna lista obsługiwanych formatów kodowania i opcji generowania znajduje się w dokumentacji dotyczącej generowania BarCode.
Generowanie kodów QR z brandingiem
Barkoder nie generuje barcode'ów.IronBarcode generuje kody QR z osadzonymi logo, co jest powszechnym wymaganiem w procesach marketingowych, pakowania i identyfikacji produktów.
Podejście barKoder MAUI:
Not available — Plugin.Maui.Barkoder is a reader-only SDK with no
generation API on any platform.
Podejście IronBarcode:
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
// QR code with brand logo embedded at centre
QRCodeWriter.CreateQrCode("https://parts.example.com/product/A42", 500)
.AddBrandLogo("company-logo.png")
.SaveAsPng("branded-qr.png");
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
// QR code with brand logo embedded at centre
QRCodeWriter.CreateQrCode("https://parts.example.com/product/A42", 500)
.AddBrandLogo("company-logo.png")
.SaveAsPng("branded-qr.png");
Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
' QR code with brand logo embedded at centre
QRCodeWriter.CreateQrCode("https://parts.example.com/product/A42", 500) _
.AddBrandLogo("company-logo.png") _
.SaveAsPng("branded-qr.png")
Punkt końcowy API BarCode ASP.NET Core
Barkoder nie posiada modelu wdrożenia po stronie serwera. Odpowiednik mobilnego punktu końcowego do skanowania i przesyłania danych — odbierającego obraz z dowolnego klienta i zwracającego dane BARCODE — wymaga biblioteki .NET.
Podejście barKoder:
Not available — Plugin.Maui.Barkoder runs only inside a MAUI app head
against a live camera. There is no ASP.NET Core integration and no
server-side execution model.
Podejście IronBarcode:
// In Program.cs
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
app.MapPost("/api/scan", async (IFormFile file) =>
{
using var stream = file.OpenReadStream();
var imageBytes = new byte[stream.Length];
await stream.ReadAsync(imageBytes);
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true,
};
var results = BarcodeReader.Read(imageBytes, options);
return Results.Ok(results.Select(r => new
{
Value = r.Value,
Format = r.Format.ToString(),
}));
});
// In Program.cs
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
app.MapPost("/api/scan", async (IFormFile file) =>
{
using var stream = file.OpenReadStream();
var imageBytes = new byte[stream.Length];
await stream.ReadAsync(imageBytes);
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true,
};
var results = BarcodeReader.Read(imageBytes, options);
return Results.Ok(results.Select(r => new
{
Value = r.Value,
Format = r.Format.ToString(),
}));
});
Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
app.MapPost("/api/scan", Async Function(file As IFormFile) As Task(Of IResult)
Using stream = file.OpenReadStream()
Dim imageBytes(CInt(stream.Length) - 1) As Byte
Await stream.ReadAsync(imageBytes, 0, imageBytes.Length)
Dim options As New BarcodeReaderOptions With {
.Speed = ReadingSpeed.Balanced,
.ExpectMultipleBarcodes = True
}
Dim results = BarcodeReader.Read(imageBytes, options)
Return Results.Ok(results.Select(Function(r) New With {
.Value = r.Value,
.Format = r.Format.ToString()
}))
End Using
End Function)
Odnośnik mapowania API SDK barKoder do IronBarcode
Ta tabela mapuje powierzchnię MAUI/Xamarin Barkodera na odpowiednie wywołanie IronBarcode:
| API barKoder | Odpowiednik IronBarcode |
|---|---|
| Ustawienie licencji poprzez portal/kokpit barKoder | IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY" |
Konfiguracja DeBlur na BarkoderView |
Speed = ReadingSpeed.ExtremeDetail |
Konfiguracja wielokrotnego skanowania na BarkoderView |
ExpectMultipleBarcodes = true |
SetEnabledBarcodeTypes(...) |
BarcodeEncoding.<Format> (automatycznie wykrywana podczas odczytu) |
BarkoderView.StartScanning(IBarkoderDelegate) |
BarcodeReader.Read("image.png") — synchroniczne |
BarcodeResult.TextualData |
result.Value |
BarcodeResult.BarcodeTypeName |
result.Format |
| MatrixSight – odzyskiwanie danych po awarii | ReadingSpeed.ExtremeDetail z wstępną obróbką ML |
| Wejście z ramki kamery na żywo | Ścieżka do pliku / Stream / wejście byte[] |
| Przetwarzanie na urządzeniu | W pełni lokalne — bez połączeń sieciowych |
| Brak obsługi generacji | BarcodeWriter.CreateBarcode() / QRCodeWriter.CreateQrCode() |
| Brak obsługi plików PDF | BarcodeReader.Read("document.pdf") — natywne |
| Brak wdrożenia na serwerze | Działa w ASP.NET Core, Docker, Azure Functions, Lambda |
| Brak indeksu strony (nie dotyczy) | result.PageNumber — dostępne przy odczycie PDF |
Typowe problemy związane z migracją i ich rozwiązania
Kwestia 1: Nazwy pakietów NuGet
barKoder SDK: Oficjalne pakiety .NET to Plugin.Maui.Barkoder i Barkoder.Xamarin. Żaden z nich nie obejmuje scenariuszy niemożliwających użycia na mobile.
Rozwiązanie: Zainstaluj IronBarcode:
dotnet add package BarCode
Jeśli Plugin.Maui.Barkoder nie jest już potrzebny (przechodzisz całkowicie na przetwarzanie plików / PDF / serwerowe), usuń go:
dotnet remove package Plugin.Maui.Barkoder
dotnet add package BarCode
dotnet remove package Plugin.Maui.Barkoder
dotnet add package BarCode
Kwestia 2: Wejście z ramki kamery kontra wejście plikowe
SDK barKoder: Wszystkie wejścia są dostarczane jako ramki kamery na żywo — ciągła transmisja wideo przetwarzana na urządzeniu. Nie ma trybu wejścia ścieżki pliku.
Rozwiązanie:IronBarcode akceptuje pliki, strumienie, tablice bajtów oraz obiekty System.Drawing.Image. W przypadku obrazów przesłanych z klienta mobilnego należy odczytać strumień żądania bezpośrednio:
using var stream = file.OpenReadStream();
var imageBytes = new byte[stream.Length];
await stream.ReadAsync(imageBytes);
var results = BarcodeReader.Read(imageBytes, options);
using var stream = file.OpenReadStream();
var imageBytes = new byte[stream.Length];
await stream.ReadAsync(imageBytes);
var results = BarcodeReader.Read(imageBytes, options);
Imports System.IO
Using stream = file.OpenReadStream()
Dim imageBytes = New Byte(stream.Length - 1) {}
Await stream.ReadAsync(imageBytes, 0, imageBytes.Length)
Dim results = BarcodeReader.Read(imageBytes, options)
End Using
Problem 3: API oparte na wywołaniach zwrotnych a wyniki synchroniczne
barKoder SDK: BarkoderView.StartScanning(IBarkoderDelegate) używa wzorca delegata / wywołania zwrotnego — DidFinishScanning(BarcodeResult[]) wywoływane jest asynchronicznie, gdy kody kreskowe są wykrywane w strumieniu z kamery.
Rozwiązanie: BarcodeReader.Read()IronBarcode jest synchroniczne i zwraca bezpośrednio IEnumerable<BarcodeResult>. W kontekstach ASP.NET Core, gdzie wymagane jest użycie async, owiń w Task.Run():
var results = await Task.Run(() => BarcodeReader.Read(imageBytes, options));
var results = await Task.Run(() => BarcodeReader.Read(imageBytes, options));
Dim results = Await Task.Run(Function() BarcodeReader.Read(imageBytes, options))
Problem 4: Konfiguracja trybu DeBlur
barKoder SDK: DeBlur jest włączony w konfiguracji BarkoderView przed rozpoczęciem skanowania i ma zastosowanie do wszystkich kolejnych skanów.
Rozwiązanie: W IronBarcode, ekwiwalentem jest ReadingSpeed.ExtremeDetail ustawione dla każdego odczytu przez BarcodeReaderOptions. Utwórz obiekt opcji raz i wykorzystuj go ponownie:
var deepOptions = new BarcodeReaderOptions
{
Speed = ReadingSpeed.ExtremeDetail,
ExpectMultipleBarcodes = false,
};
// Reuse across multiple reads
var results = BarcodeReader.Read("image.png", deepOptions);
var deepOptions = new BarcodeReaderOptions
{
Speed = ReadingSpeed.ExtremeDetail,
ExpectMultipleBarcodes = false,
};
// Reuse across multiple reads
var results = BarcodeReader.Read("image.png", deepOptions);
Imports System
Dim deepOptions As New BarcodeReaderOptions With {
.Speed = ReadingSpeed.ExtremeDetail,
.ExpectMultipleBarcodes = False
}
' Reuse across multiple reads
Dim results = BarcodeReader.Read("image.png", deepOptions)
Problem 5: Brak możliwości generowania
SDK barKoder: Barkoder jest trybem tylko do odczytu. Nie ma API do generowania kodów kreskowych ani kodów QR.
Rozwiązanie:IronBarcode obsługuje zarówno odczyt, jak i generowanie. Używaj BarcodeWriter dla standardowych formatów i QRCodeWriter dla kodów QR:
// Standard barcode generation
BarcodeWriter.CreateBarcode("SHIP-20240315-00428", BarcodeEncoding.Code128)
.SaveAsPng("shipping-label.png");
// QR code generation
QRCodeWriter.CreateQrCode("https://example.com/product/A42", 500)
.SaveAsPng("product-qr.png");
// Get as bytes for embedding in API response or PDF
byte[] barcodeBytes = BarcodeWriter.CreateBarcode("INV-100291", BarcodeEncoding.Code128)
.ToPngBinaryData();
// Standard barcode generation
BarcodeWriter.CreateBarcode("SHIP-20240315-00428", BarcodeEncoding.Code128)
.SaveAsPng("shipping-label.png");
// QR code generation
QRCodeWriter.CreateQrCode("https://example.com/product/A42", 500)
.SaveAsPng("product-qr.png");
// Get as bytes for embedding in API response or PDF
byte[] barcodeBytes = BarcodeWriter.CreateBarcode("INV-100291", BarcodeEncoding.Code128)
.ToPngBinaryData();
Imports System
' Standard barcode generation
BarcodeWriter.CreateBarcode("SHIP-20240315-00428", BarcodeEncoding.Code128) _
.SaveAsPng("shipping-label.png")
' QR code generation
QRCodeWriter.CreateQrCode("https://example.com/product/A42", 500) _
.SaveAsPng("product-qr.png")
' Get as bytes for embedding in API response or PDF
Dim barcodeBytes As Byte() = BarcodeWriter.CreateBarcode("INV-100291", BarcodeEncoding.Code128) _
.ToPngBinaryData()
Lista kontrolna migracji SDK barKoder
Zadania przed migracją
Przeglądnij swoją bazę kodu pod kątem referencji barKoder:
grep -r "Barkoder\|BarkoderView\|IBarkoderDelegate\|BarcodeResult" --include="*.cs" .
grep -r "Plugin.Maui.Barkoder\|Barkoder.Xamarin" --include="*.csproj" .
grep -r "Barkoder" --include="*.xaml" .
grep -r "Barkoder\|BarkoderView\|IBarkoderDelegate\|BarcodeResult" --include="*.cs" .
grep -r "Plugin.Maui.Barkoder\|Barkoder.Xamarin" --include="*.csproj" .
grep -r "Barkoder" --include="*.xaml" .
Opisz obecnie wdrożone lub planowane scenariusze wykorzystania BarCode'ów:
- Jakie formaty BARCODE-ów muszą być odczytywane (Code128, DataMatrix, QR, PDF417 itp.)
- Czy wymagane jest odzyskiwanie uszkodzonego kodu kreskowego (
ReadingSpeed.ExtremeDetail) - Czy wymagane jest wykrywanie wielu kodów kreskowych (
ExpectMultipleBarcodes = true) - Czy wymagane jest generowanie kodów kreskowych (
BarcodeWriter,QRCodeWriter) - Czy wymagane jest przetwarzanie PDF (
BarcodeReader.Read("doc.pdf")) - Środowiska docelowe (.NET Core, Azure Functions, Docker, Lambda, komputery stacjonarne, MAUI)
Zadania związane z aktualizacją kodu
- Usuń
Plugin.Maui.BarkoderlubBarkoder.Xamarinz.csprojtam, gdzie nie jest już potrzebne - Zainstaluj pakiet NuGet
BarCode - Usuń
using Barkoder.Maui;(lub odpowiednik Xamarin) tam, gdzie nie jest już potrzebne - Dodaj
using IronBarCode;do wszystkich plików przetwarzania kodów kreskowych - Dodaj
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";przy uruchamianiu aplikacji - Zastąp wywołania zwrotne
BarkoderView.StartScanning/DidFinishScanningzBarcodeReader.Read(filePath, options) - Mapuj
BarcodeResult.TextualDatadoresult.Value - Mapuj
BarcodeResult.BarcodeTypeNamedoresult.Format - Mapuj konfigurację DeBlur do
Speed = ReadingSpeed.ExtremeDetailwBarcodeReaderOptions - Mapuj konfigurację wielokrotnego skanowania do
ExpectMultipleBarcodes = truewBarcodeReaderOptions - Dodaj wywołania
BarcodeWriter.CreateBarcode()dla wszelkich wymagań generowania - Dodaj wywołania
QRCodeWriter.CreateQrCode()dla wymagań generowania kodów QR - Zastąp jakikolwiek kod wstępnego przetwarzania PDF
BarcodeReader.Read("document.pdf") - Owiń synchroniczne wywołania
BarcodeReader.Read()wTask.Run()dla asynchronicznych punktów końcowych ASP.NET Core
Testy po migracji
Po zakończeniu aktualizacji kodu sprawdź, czy:
- Potwierdź, że
BarcodeReader.Read()zwraca wyniki dla wszystkich używanych formatów obrazów (PNG, JPEG, TIFF, BMP) - Zweryfikuj, że
ReadingSpeed.ExtremeDetailodzyskuje kody kreskowe z próbek najniższej jakości w twoim zestawie testowym - Potwierdź, że
ExpectMultipleBarcodes = truezwraca poprawną liczbę kodów kreskowych z dokumentów z wieloma kodami kreskowymi - Przetestuj odczyt plików PDF w odniesieniu do wszystkich wersji PDF używanych w produkcyjnych procesach dokumentacyjnych
- Zweryfikuj, że wynik
BarcodeWriter.CreateBarcode()jest skanowalny przez twoje docelowe skanery - Zweryfikuj, że wynik
QRCodeWriter.CreateQrCode()jest skanowalny przez mobilne czytniki kodów QR - Przetestuj punkt końcowy .NET Core (jeśli dotyczy) przy użyciu przesyłania plików z klientów mobilnych
- Potwierdź prawidłowe działanie w środowiskach wdrożeniowych Docker, Azure lub Lambda
- Przeprowadź testy end-to-end obejmujące pełny cykl odczytu-przetwarzania-generowania, tam gdzie to możliwe
Kluczowe korzyści wynikające z migracji do IronBarcode
Platforma obejmująca .NET bez kamery:IronBarcode instaluje się z NuGet i działa w dowolnym projekcie .NET — ASP.NET Core, Azure Functions, Lambda, Docker, konsola, pracownik, WPF, WinForms, Avalonia, Blazor, MAUI. Plugin.Maui.Barkoder Barkoder obejmuje tylko interfejs użytkownika kamery wewnątrz głowy aplikacji mobilnej MAUI;IronBarcode obejmuje wszystko inne.
Odczyt odporny na uszkodzenia bez kamery: Zdolności, które uczyniły Barkoder atrakcyjnym — DeBlur, MatrixSight, odzyskiwanie uszkodzeń — są obecne w IronBarcode przez ReadingSpeed.ExtremeDetail i oparte na ML wstępne przetwarzanie obrazu.IronBarcode zapewnia taką samą poprawę dokładności, jaką Barkoder osiąga w przypadku obrazu z kamery na żywo, w odniesieniu do plików, zeskanowanych dokumentów i przesłanych obrazów.
Kompletny proces odczytu i generowania: Barkoder jest tylko do odczytu.IronBarcode obsługuje zarówno odczyt, jak i generowanie kodów kreskowych w ponad 50 formatach w ramach jednego pakietu. Zespoły, które muszą generować etykiety wysyłkowe, tworzyć kody QR na opakowania lub osadzać BarCodes w dokumentach, nie potrzebują drugiej biblioteki.
Wbudowana obsługa plików PDF: Odczytywanie kodów kreskowych z dokumentów PDF — faktur, listów przewozowych, dokumentacji medycznej, dokumentów zgodności — to jedna z najważniejszych funkcji IronBarcode. Bez pośredniego wyodrębniania obrazów, bez wywołań API dla każdej strony i bez dodatkowych zależności. Wielostronicowy plik PDF jest przetwarzany w pojedynczym wywołaniu BarcodeReader.Read().
Pełne wdrożenie po stronie serwera:IronBarcode działa w środowisku ASP.NET Core, Azure Functions, AWS Lambda, kontenerach Docker oraz w każdym innym środowisku hostingowym .NET. Przetwarza BARCODES lokalnie, bez połączeń sieciowych, bez konieczności zarządzania kluczami API i bez opóźnień spowodowanych przez usługę zdalną. Przetworzenie jednego BARCODE'a lub miliona kosztuje tyle samo — nie ma opłat za żądanie.
Przewidywalna cena licencji wieczystej:IronBarcode jest dostępny w ramach jednorazowej licencji wieczystej w cenie od 749 USD dla pojedynczego programisty, bez opłat za żądania, bez limitów ilościowych i bez konieczności odnawiania subskrypcji. Dla zespołów tworzących aplikacje produkcyjne przetwarzające BarCodes na dużą skalę model kosztowy jest prosty i przewidywalny.
Często Zadawane Pytania
Dlaczego warto przejść z Barkoder SDK na IronBarcode?
Typowe powody to uproszczenie licencjonowania (eliminacja złożoności związanej z SDK i kluczem uruchomieniowym), zniesienie limitów przepustowości, uzyskanie natywnej obsługi plików PDF, usprawnienie wdrażania w środowisku Docker/CI/CD oraz ograniczenie powtarzalnego kodu API w kodzie produkcyjnym.
Jak zastąpić wywołania API Barkoder za pomocą IronBarcode?
Zastąp standardowe fragmenty kodu dotyczące tworzenia instancji i licencjonowania wyrażeniem IronBarCode.License.LicenseKey = "key". Zastąp wywołania czytnika wyrażeniem BarcodeReader.Read(path), a wywołania zapisu wyrażeniem BarcodeWriter.CreateBarcode(data, encoding). Metody statyczne nie wymagają zarządzania instancjami.
Jak bardzo zmienia się kod podczas migracji z Barkoder SDK do IronBarcode?
Większość migracji skutkuje zmniejszeniem liczby linii kodu. Usuwane są standardowe fragmenty dotyczące licencji, konstruktory instancji oraz jawna konfiguracja formatów. Podstawowe operacje odczytu/zapisu są mapowane na krótsze odpowiedniki w IronBarcode z bardziej przejrzystymi obiektami wynikowymi.
Czy podczas migracji muszę mieć zainstalowane zarówno Barkoder SDK, jak i IronBarcode?
Nie. Większość migracji polega na bezpośredniej wymianie, a nie na równoległym działaniu. Należy migrować po jednej klasie usługowej na raz, zastąpić odwołanie do NuGet oraz zaktualizować wzorce instancjonowania i wywoływania API przed przejściem do kolejnej klasy.
Jaka jest nazwa pakietu NuGet dla IronBarcode?
Pakiet nosi nazwę „IronBarcode” (z wielkimi literami B i C). Zainstaluj go za pomocą polecenia „Install-Package IronBarcode” lub „dotnet add package IronBarcode”. Dyrektywa using w kodzie to „using IronBarcode;”.
W jaki sposób IronBarcode upraszcza wdrażanie Docker w porównaniu z Barkoder SDK?
IronBarcode to pakiet NuGet bez zewnętrznych plików SDK ani konfiguracji licencji. W Dockerze należy ustawić zmienną środowiskową IRONBARCODE_LICENSE_KEY, a pakiet zajmie się weryfikacją licencji podczas uruchamiania.
Czy IronBarcode automatycznie wykrywa wszystkie formaty kodów kreskowych po migracji z Barkoder?
Tak. IronBarcode automatycznie wykrywa symbole we wszystkich obsługiwanych formatach. Wyraźne wyliczenie typów kodów kreskowych nie jest wymagane. Jeśli format jest już znany, a wydajność ma znaczenie, BarcodeReaderOptions pozwala ograniczyć obszar wyszukiwania w celu optymalizacji.
Czy IronBarcode może odczytywać BarCodes z plików PDF bez oddzielnej biblioteki?
Tak. BarCodeReader.Read("document.pdf") przetwarza pliki PDF natywnie. Wyniki obejmują PageNumber, Format, Value i Confidence dla każdego znalezionego kodu kreskowego. Nie jest wymagany żaden zewnętrzny etap renderowania pliku PDF.
W jaki sposób IronBarcode obsługuje równoległe przetwarzanie kodów kreskowych?
Metody statyczne IronBarcode są bezstanowe i bezpieczne dla wątków. Użyj Parallel.ForEach bezpośrednio na listach plików bez zarządzania instancjami dla poszczególnych wątków. BarcodeReaderOptions.MaxParallelThreads kontroluje wewnętrzny limit wątków.
Jakie właściwości wyników ulegają zmianie podczas migracji z Barkoder SDK do IronBarcode?
Typowe zmiany nazw: BarcodeValue staje się Value, BarcodeType staje się Format. Wyniki IronBarcode zawierają również Confidence i PageNumber. Funkcja wyszukiwania i zamiany w całym rozwiązaniu obsługuje zmiany nazw w istniejącym kodzie przetwarzania wyników.
Jak skonfigurować licencjonowanie IronBarcode w potoku CI/CD?
Zapisz IronBarcode_LICENSE_KEY jako sekret potoku i przypisz IronBarCode.License.LicenseKey w kodzie uruchamiającym aplikację. Jeden sekret obejmuje wszystkie środowiska, w tym środowisko programistyczne, testowe, przejściowe i produkcyjne.
Czy IronBarcode obsługuje generowanie kodów QR z niestandardowym stylem?
Tak. Funkcja QRCodeWriter.CreateQrCode() obsługuje niestandardowe kolory za pomocą ChangeBarCodeColor(), osadzanie logo za pomocą AddBrandLogo(), konfigurowalne poziomy korekcji błędów oraz wiele formatów wyjściowych, w tym PNG, JPG, PDF i strumień.

