
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}");
}
}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 ClassImports 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 ClassIronBarcode 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}")
NextImports 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}")
NextPoró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:
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
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 IronBarCodeImports IronBarCodeKrok 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"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 ClassImports 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 ClassPodejś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}")
NextImports 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}")
NextFunkcja 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 SubImports 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 SubPodejś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 IfImports 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 IfReadingSpeed.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 SubImports Barkoder.Maui
BarkoderView.StartScanning(Me)
Public Sub DidFinishScanning(result As BarcodeResult())
For Each r In result
Console.WriteLine($"{r.BarcodeTypeName}: {r.TextualData}")
Next
End SubPodejś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}")
NextImports 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}")
NextJest 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 SubImports 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 SubPodejś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}")
NextImports 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}")
NextPeł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")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)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:
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
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 UsingImports 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 UsingProblem 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))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)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()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" .
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.
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ęczników.
Powiązane artykuły


