Jak odczytywać BarCodes z obiektów rysunkowych systemu

How to Read Barcodes From System.Drawing in C

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

IronBarcode umożliwia odczytywanie kodów kreskowych z obiektów System.Drawing we wszystkich systemach operacyjnych poprzez automatyczne konwertowanie ich na AnyBitmap za pomocą IronDrawing, rozwiązując problem ograniczenia obsługi System.Drawing wyłącznie w systemie Windows firmy Microsoft.

Wprowadzenie

Obiekty System.Drawing są szeroko stosowane w środowisku .NET do zadań związanych z przetwarzaniem obrazów. Jednak firma Microsoft zaprzestała obsługi System.Drawing w systemach macOS i Linux, obsługując obecnie wyłącznie system Windows. Ta zmiana spowodowała problemy dla programistów korzystających z IronBarcode w systemach operacyjnych innych niż Windows, ponieważ praca z kodami kreskowymi zazwyczaj wiąże się z grafiką, obrazami i czcionkami.

Aby rozwiązać ten problem, wprowadziliśmy IronDrawing. Ta bezpłatna biblioteka typu open source, stworzona przez Iron Software, upraszcza obsługę wielu platform i zapewnia płynne działanie. Po zainstalowaniu IronBarcode z NuGet, IronDrawing jest automatycznie dołączany do projektu.

Programiści, którzy dopiero zaczynają przygodę z odczytywaniem BarCodes, mogą zapoznać się z naszym obszernym samouczkiem "Odczytywanie BarCodes", obejmującym podstawowe pojęcia i wzorce użytkowania. Jeśli pracujesz z różnymi formatami obrazów, nasz przewodnik dotyczący odczytywania BARCODE-ów z obrazów zawiera dodatkowe informacje i przykłady.

Szybki start: Odczytaj BARCODE za pomocą AnyBitmap w jednym prostym wierszu

Ten fragment kodu pokazuje, jak IronBarcode odczytuje kody kreskowe, tworząc System.Drawing.Bitmap i pozwalając IronDrawing na domyślne rzutowanie go na AnyBitmap. Wystarczy jedna linijka kodu, aby programiści korzystający z dowolnego systemu operacyjnego uzyskali szybkie wyniki.

  1. Install IronBarcode with NuGet Package Manager

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

    var results = IronBarCode.BarcodeReader.Read((AnyBitmap)(new System.Drawing.Bitmap("yourImage.png")));
  3. Wdrożenie do testowania w środowisku produkcyjnym

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

    arrow pointer

Jak rzutować obiekty System.Drawing na AnyBitmap?

Odczytanie BARCODE-ów z System.Drawing wymaga rzutowania obiektu na AnyBitmap. IronDrawing został zaprojektowany z myślą o łatwości użytkowania i obsługuje niejawne rzutowanie obiektów obrazu z System.Drawing na obiekty obrazu IronSoftware.Drawing o nazwie AnyBitmap.

Oprócz obiektów System.Drawing obsługujemy rzutowanie z innych typów:

  • System.Drawing.Bitmap
  • System.Drawing.Image
  • SkiaSharp.SKBitmap
  • SkiaSharp.SKImage
  • SixLabors.ImageSharp

Zobacz ten przykład kodu, aby zapoznać się z rzutowaniem powyższych obiektów. Poniżej przedstawiono konwersję obrazów BARCODE-ów z obiektów System.Drawing do IronSoftware.Drawing.AnyBitmap:

Które typy System.Drawing można rzutować?

:path=/static-assets/barcode/content-code-examples/how-to/read-barcodes-from-system-drawing-cast-to-anybitmap.cs
using IronSoftware.Drawing;
using System.Collections.Generic;

List<AnyBitmap> barcodes = new List<AnyBitmap>();

// Instantiate System.Drawing.Bitmap
System.Drawing.Bitmap bitmapFromBitmap = new System.Drawing.Bitmap("test1.jpg");

// Cast from System.Drawing.Bitmap to AnyBitmap
AnyBitmap barcode1 = bitmapFromBitmap;

barcodes.Add(barcode1);

// Instantiate System.Drawing.Bitmap
System.Drawing.Image bitmapFromFile = System.Drawing.Image.FromFile("test2.png");

// Cast from System.Drawing.Image to AnyBitmap
AnyBitmap barcode2 = bitmapFromFile;

barcodes.Add(barcode2);
Imports IronSoftware.Drawing
Imports System.Collections.Generic

Private barcodes As New List(Of AnyBitmap)()

' Instantiate System.Drawing.Bitmap
Private bitmapFromBitmap As New System.Drawing.Bitmap("test1.jpg")

' Cast from System.Drawing.Bitmap to AnyBitmap
Private barcode1 As AnyBitmap = bitmapFromBitmap

barcodes.Add(barcode1)

' Instantiate System.Drawing.Bitmap
Dim bitmapFromFile As System.Drawing.Image = System.Drawing.Image.FromFile("test2.png")

' Cast from System.Drawing.Image to AnyBitmap
Dim barcode2 As AnyBitmap = bitmapFromFile

barcodes.Add(barcode2)
$vbLabelText   $csharpLabel

Ten kod pokazuje płynną integrację między obiektami System.Drawing a IronBarcode poprzez IronDrawing. Ta kompatybilność obejmuje różne formaty kodów kreskowych, szczegółowo opisane w naszym przewodniku po obsługiwanych formatach kodów kreskowych, w tym kody QR, Code 128, Code 39 i wiele innych.

Dlaczego rzutowanie niejawne działa?

W powyższym kodzie załadowaliśmy dwa obrazy BARCODE jako System.Drawing.Bitmap i System.Drawing.Image. Następnie w sposób dorozumiany rzutowaliśmy je do AnyBitmap, przypisując je do obiektów AnyBitmap, a następnie dodaliśmy te obiekty do listy AnyBitmap.

Mechanizm domyślnego rzutowania IronDrawing wykorzystuje przeciążanie operatorów, zapewniając przejrzystą konwersję między typami System.Drawing a AnyBitmap. Ten wzorzec projektowy pozwala programistom zachować istniejący kod, jednocześnie zyskując kompatybilność między platformami. Konwersja zachowuje wszystkie właściwości obrazu, w tym rozdzielczość, głębię kolorów i dane pikselowe, zapewniając brak utraty jakości.

Kiedy należy stosować rzutowanie jawne, a kiedy niejawne?

Chociaż rzutowanie niejawne zapewnia wygodę, w niektórych scenariuszach preferowane może być rzutowanie jawne:

// Implicit casting - clean and simple for straightforward conversions
System.Drawing.Bitmap systemBitmap = new System.Drawing.Bitmap("barcode.png");
AnyBitmap anyBitmap = systemBitmap; // Implicit cast

// Explicit casting - useful when type clarity is important
System.Drawing.Image systemImage = System.Drawing.Image.FromFile("qrcode.jpg");
AnyBitmap explicitBitmap = (AnyBitmap)systemImage; // Explicit cast

// When working with nullable types or conditional logic
System.Drawing.Bitmap? nullableBitmap = GetBitmapFromSource();
if (nullableBitmap != null)
{
    AnyBitmap result = (AnyBitmap)nullableBitmap; // Explicit cast for clarity
    // Process the barcode
}
// Implicit casting - clean and simple for straightforward conversions
System.Drawing.Bitmap systemBitmap = new System.Drawing.Bitmap("barcode.png");
AnyBitmap anyBitmap = systemBitmap; // Implicit cast

// Explicit casting - useful when type clarity is important
System.Drawing.Image systemImage = System.Drawing.Image.FromFile("qrcode.jpg");
AnyBitmap explicitBitmap = (AnyBitmap)systemImage; // Explicit cast

// When working with nullable types or conditional logic
System.Drawing.Bitmap? nullableBitmap = GetBitmapFromSource();
if (nullableBitmap != null)
{
    AnyBitmap result = (AnyBitmap)nullableBitmap; // Explicit cast for clarity
    // Process the barcode
}
Imports System.Drawing

' Implicit casting - clean and simple for straightforward conversions
Dim systemBitmap As New Bitmap("barcode.png")
Dim anyBitmap As AnyBitmap = systemBitmap ' Implicit cast

' Explicit casting - useful when type clarity is important
Dim systemImage As Image = Image.FromFile("qrcode.jpg")
Dim explicitBitmap As AnyBitmap = CType(systemImage, AnyBitmap) ' Explicit cast

' When working with nullable types or conditional logic
Dim nullableBitmap As Bitmap = GetBitmapFromSource()
If nullableBitmap IsNot Nothing Then
    Dim result As AnyBitmap = CType(nullableBitmap, AnyBitmap) ' Explicit cast for clarity
    ' Process the barcode
End If
$vbLabelText   $csharpLabel

Jakie są typowe błędy związane z typowaniem?

Podczas konwersji System.Drawing na AnyBitmap programiści mogą napotkać:

  1. Wyjątki odwołania do wartości null: Przed rzutowaniem sprawdź, czy obiekt System.Drawing nie jest null
  2. Wyjątki dotyczące formatów nieobsługiwanych: Niektóre rzadkie formaty obrazów wymagają wstępnej konwersji
  3. Problemy z pamięcią: duże obrazy wymagają odpowiednich schematów usuwania

W przypadku problemów z kodowaniem nasz przewodnik po rozwiązywaniu problemów zawiera rozwiązania typowych problemów występujących podczas rozpoznawania BARCODE-ów.

Jak odczytywać BARCODES z obiektów AnyBitmap?

IronBarcode akceptuje obiekty IronSoftware.Drawing.AnyBitmap we wszystkich metodach bez dodatkowej konfiguracji. Ułatwia to programowanie przy użyciu obiektów System.Drawing w systemach operacyjnych innych niż Windows. Poniższy kod ilustruje to:

Jakie metody akceptują parametry AnyBitmap?

:path=/static-assets/barcode/content-code-examples/how-to/read-barcodes-from-system-drawing-read-anybitmap.cs
using IronBarCode;
using IronSoftware.Drawing;
using System;
using System.Collections.Generic;

// Create a list of image file paths to read barcodes from
List<string> barcodeFiles = new List<string>
{
    "test1.jpg",
    "test2.png"
};

foreach (var barcodeFile in barcodeFiles)
{
    // Read the barcode from file path
    var results = BarcodeReader.Read(barcodeFile);
    foreach (var result in results)
    {
        // Output the detected barcode value
        Console.WriteLine(result.Value);
    }
}
Imports IronBarCode
Imports IronSoftware.Drawing
Imports System
Imports System.Collections.Generic

' Create a list of image file paths to read barcodes from
Dim barcodeFiles As New List(Of String) From {
    "test1.jpg",
    "test2.png"
}

For Each barcodeFile In barcodeFiles
    ' Read the barcode from file path
    Dim results = BarcodeReader.Read(barcodeFile)
    For Each result In results
        ' Output the detected barcode value
        Console.WriteLine(result.Value)
    Next
Next
$vbLabelText   $csharpLabel

Oprócz podstawowej metody Read, IronBarcode udostępnia kilka metod akceptujących parametry AnyBitmap. W przypadku zaawansowanych scenariuszy zapoznaj się z naszym przewodnikiem dotyczącym odczytu wielu BarCodes, który pokazuje wydajne przetwarzanie wielu BarCodes na jednym obrazie:

// Advanced barcode reading with options
var readerOptions = new BarcodeReaderOptions
{
    // Specify barcode types to search for
    ExpectBarcodeTypes = BarcodeEncoding.QRCode | BarcodeEncoding.Co/de128,
    // Enable machine learning for better accuracy
    UseML = true,
    // Set confidence threshold
    Confidence = 0.95
};

// Read with specific options
var advancedResults = BarcodeReader.Read(anyBitmap, readerOptions);
// Advanced barcode reading with options
var readerOptions = new BarcodeReaderOptions
{
    // Specify barcode types to search for
    ExpectBarcodeTypes = BarcodeEncoding.QRCode | BarcodeEncoding.Co/de128,
    // Enable machine learning for better accuracy
    UseML = true,
    // Set confidence threshold
    Confidence = 0.95
};

// Read with specific options
var advancedResults = BarcodeReader.Read(anyBitmap, readerOptions);
' Advanced barcode reading with options
Dim readerOptions As New BarcodeReaderOptions With {
    ' Specify barcode types to search for
    .ExpectBarcodeTypes = BarcodeEncoding.QRCode Or BarcodeEncoding.Code128,
    ' Enable machine learning for better accuracy
    .UseML = True,
    ' Set confidence threshold
    .Confidence = 0.95
}

' Read with specific options
Dim advancedResults = BarcodeReader.Read(anyBitmap, readerOptions)
$vbLabelText   $csharpLabel

Jak postępować w przypadku wielu wyników skanowania BarCode'ów?

Powyższy kod stanowi rozszerzenie poprzedniego przykładu. Po wypełnieniu listy AnyBitmap, przeszliśmy przez nią i wywołaliśmy metodę Read na każdym obiekcie AnyBitmap, co zwróciło IronBarCode.BarcodeResults. Następnie przetworzyliśmy wyniki, aby wydrukować wartości BARCODE na konsoli.

W przypadku obsługi wielu BarCodes należy wykorzystać przetwarzanie równoległe w celu uzyskania lepszej wydajności:

// Parallel processing for multiple barcode images
var barcodeFiles = Directory.GetFiles("barcodes/", "*.png");
var allResults = new ConcurrentBag<BarcodeResult>();

Parallel.ForEach(barcodeFiles, file =>
{
    var bitmap = new System.Drawing.Bitmap(file);
    var anyBitmap = (AnyBitmap)bitmap;
    var results = BarcodeReader.Read(anyBitmap);

    foreach (var result in results)
    {
        allResults.Add(result);
    }

    bitmap.Dispose(); // Clean up resources
});

// Process all results
foreach (var result in allResults)
{
    Console.WriteLine($"Found {result.BarcodeType}: {result.Value}");
}
// Parallel processing for multiple barcode images
var barcodeFiles = Directory.GetFiles("barcodes/", "*.png");
var allResults = new ConcurrentBag<BarcodeResult>();

Parallel.ForEach(barcodeFiles, file =>
{
    var bitmap = new System.Drawing.Bitmap(file);
    var anyBitmap = (AnyBitmap)bitmap;
    var results = BarcodeReader.Read(anyBitmap);

    foreach (var result in results)
    {
        allResults.Add(result);
    }

    bitmap.Dispose(); // Clean up resources
});

// Process all results
foreach (var result in allResults)
{
    Console.WriteLine($"Found {result.BarcodeType}: {result.Value}");
}
Imports System.IO
Imports System.Collections.Concurrent
Imports System.Drawing
Imports System.Threading.Tasks

' Parallel processing for multiple barcode images
Dim barcodeFiles = Directory.GetFiles("barcodes/", "*.png")
Dim allResults = New ConcurrentBag(Of BarcodeResult)()

Parallel.ForEach(barcodeFiles, Sub(file)
                                   Dim bitmap = New Bitmap(file)
                                   Dim anyBitmap = CType(bitmap, AnyBitmap)
                                   Dim results = BarcodeReader.Read(anyBitmap)

                                   For Each result In results
                                       allResults.Add(result)
                                   Next

                                   bitmap.Dispose() ' Clean up resources
                               End Sub)

' Process all results
For Each result In allResults
    Console.WriteLine($"Found {result.BarcodeType}: {result.Value}")
Next
$vbLabelText   $csharpLabel

Jakie inne funkcje IronDrawing mogę wykorzystać?

IronSoftware.Drawing funkcjonalność wykracza poza renderowanie obrazów. Obsługuje aspekty przetwarzania obrazu, takie jak kolory i czcionki, przydatne do stylizacji BarCode'ów i kodów QR. Zobacz, jak wykorzystujemy IronDrawing do dostosowywania i dodawania logo do kodów QR.

IronDrawing zapewnia zaawansowane możliwości obróbki obrazów, które uzupełniają przetwarzanie BARCODE-ów:

// Using IronDrawing for image preprocessing
using IronSoftware.Drawing;

// Load and preprocess an image before barcode reading
AnyBitmap preprocessedImage = AnyBitmap.FromFile("noisy-barcode.jpg");

// Apply image filters to improve barcode readability
preprocessedImage = preprocessedImage.ToGrayScale();
preprocessedImage = preprocessedImage.Co/ntrast(1.5); // Increase contrast
preprocessedImage = preprocessedImage.Sharpen(); // Sharpen image

// Read the preprocessed barcode
var improvedResults = BarcodeReader.Read(preprocessedImage);
// Using IronDrawing for image preprocessing
using IronSoftware.Drawing;

// Load and preprocess an image before barcode reading
AnyBitmap preprocessedImage = AnyBitmap.FromFile("noisy-barcode.jpg");

// Apply image filters to improve barcode readability
preprocessedImage = preprocessedImage.ToGrayScale();
preprocessedImage = preprocessedImage.Co/ntrast(1.5); // Increase contrast
preprocessedImage = preprocessedImage.Sharpen(); // Sharpen image

// Read the preprocessed barcode
var improvedResults = BarcodeReader.Read(preprocessedImage);
Imports IronSoftware.Drawing

' Load and preprocess an image before barcode reading
Dim preprocessedImage As AnyBitmap = AnyBitmap.FromFile("noisy-barcode.jpg")

' Apply image filters to improve barcode readability
preprocessedImage = preprocessedImage.ToGrayScale()
preprocessedImage = preprocessedImage.Contrast(1.5) ' Increase contrast
preprocessedImage = preprocessedImage.Sharpen() ' Sharpen image

' Read the preprocessed barcode
Dim improvedResults = BarcodeReader.Read(preprocessedImage)
$vbLabelText   $csharpLabel

W przypadku scenariuszy wymagających konkretnych korekt obrazu, nasz przewodnik po korekcji obrazu szczegółowo opisuje wykorzystanie filtrów w celu poprawy czytelności BARCODE-ów.

Dlaczego warto wybrać IronDrawing zamiast System.Drawing?

IronDrawing oferuje istotne zalety w porównaniu z System.Drawing:

  1. Obsługa wielu platform: Działa płynnie w systemach Windows, Linux i macOS, w przeciwieństwie do System.Drawing (tylko Windows w .NET Core/5+)
  2. Nowoczesna architektura: oparta na SkiaSharp i ImageSharp w celu zapewnienia lepszej wydajności i zarządzania pamięcią
  3. Uproszczone API: Zachowuje znane interfejsy typu System.Drawing, dodając jednocześnie nowoczesne udogodnienia
  4. Aktywny rozwój: Regularne aktualizacje i ulepszenia, w przeciwieństwie do System.Drawing w trybie konserwacji
  5. Lepsza integracja: Zaprojektowane specjalnie z myślą o optymalnej wydajności w połączeniu z produktami Iron Software

W kwestiach związanych z wdrażaniem, zwłaszcza w środowiskach chmurowych, zapoznaj się z naszymi przewodnikami dotyczącymi wdrażania w Azure i wdrażania w AWS, które zawierają szczegółowe uwagi na temat kompatybilności międzyplatformowej przy użyciu IronDrawing.

Niezależnie od tego, czy tworzysz aplikacje desktopowe, usługi internetowe czy rozwiązania natywne dla chmury, IronDrawing zapewnia, że Twój kod przetwarzania kodów kreskowych pozostaje przenośny i wydajny na wszystkich platformach, co czyni go idealnym wyborem dla nowoczesnego programowania w .NET.

Często Zadawane Pytania

Jak mogę odczytywać kody kreskowe z obiektów System.Drawing na platformach innych niż Windows?

IronBarcode automatycznie obsługuje wieloplatformowe odczytywanie kodów kreskowych z obiektów System.Drawing za pośrednictwem IronDrawing, które konwertuje je na format AnyBitmap. To rozwiązuje ograniczenie Microsoft, że System.Drawing jest tylko Windows, umożliwiając bezproblemowe odczytywanie kodów kreskowych na systemach MacOS i Linux.

Czym jest IronDrawing i dlaczego jest dołączony do odczytywania kodów kreskowych?

IronDrawing to darmowa, open-source'owa biblioteka stworzona przez Iron Software, która zapewnia wsparcie dla grafik wieloplatformowych. Jest automatycznie dołączana, gdy instalujesz IronBarcode z NuGet i umożliwia odczytywanie kodów kreskowych z obiektów System.Drawing na wszystkich systemach operacyjnych, przekształcając je w kompatybilny format AnyBitmap.

Jak skonwertować System.Drawing.Bitmap do odczytu kodów kreskowych?

Możesz odczytywać kody kreskowe z System.Drawing.Bitmap za pomocą prostej operacji rzutowania na AnyBitmap: `var results = BarcodeReader.Read((AnyBitmap)(new System.Drawing.Bitmap("yourImage.png")));`. IronBarcode automatycznie obsługuje konwersję dzięki funkcji rzutowania niejawnego IronDrawing.

Czy mogę odczytywać kody kreskowe na Linuxie i MacOS przy użyciu System.Drawing?

Tak, IronBarcode umożliwia odczytywanie kodów kreskowych z obiektów System.Drawing na Linuxie i MacOS za pośrednictwem IronDrawing, które automatycznie konwertuje obiekty System.Drawing na wieloplatformowy format AnyBitmap. To pokonuje ograniczenie Microsoft, że System.Drawing działa tylko na Windows.

Jakie typy obiektów System.Drawing mogą być używane do odczytywania kodów kreskowych?

IronBarcode wspiera odczytywanie kodów kreskowych z różnych obiektów System.Drawing, w tym System.Drawing.Bitmap i innych typów obrazów. Są one automatycznie konwertowane na AnyBitmap dzięki funkcji rzutowania niejawnego IronDrawing, umożliwiając wieloplatformową funkcjonalność skanowania kodów kreskowych.

Czy istnieje proste rozwiązanie w jednej linii do odczytywania kodów kreskowych z System.Drawing?

Tak, IronBarcode oferuje rozwiązanie w jednej linii: `var results = BarcodeReader.Read((AnyBitmap)(new System.Drawing.Bitmap("yourImage.png")));`. Ta pojedyncza linia tworzy System.Drawing.Bitmap, rzutuje ją na AnyBitmap za pomocą IronDrawing i odczytuje wszystkie kody kreskowe obecne na obrazie.

Czy IronBarcode oferuje wsparcie dla dostosowywania wyglądu kodów kreskowych?

Tak, IronBarcode oferuje rozległe opcje dostosowywania wyglądu kodów kreskowych, w tym kolory, rozmiar i adnotacje tekstowe, pozwalając dostosować kody kreskowe do konkretnych wymagań projektowych.

Jak IronBarcode może pomóc w poprawie efektywności procesów biznesowych?

IronBarcode zwiększa efektywność procesów biznesowych, umożliwiając szybkie i dokładne generowanie i odczyt kodów kreskowych, redukując błędy ręcznego wprowadzania danych i poprawiając śledzenie zapasów i aktywów.

Jakie umiejętności programistyczne są potrzebne do zaimplementowania IronBarcode w projekcie?

Podstawowa znajomość programowania w C# jest wystarczająca do zaimplementowania IronBarcode w projekcie, ponieważ oferuje on nieskomplikowane metody i kompleksową dokumentację do prowadzenia deweloperów.

Czy IronBarcode jest odpowiedni zarówno dla małych projektów, jak i dużych aplikacji korporacyjnych?

IronBarcode jest zaprojektowany do bycia skalowalnym i wszechstronnym, dzięki czemu jest odpowiedni zarówno dla małych projektów, jak i dużych aplikacji korporacyjnych, które wymagają solidnych rozwiązań kodów kreskowych.

Hairil Hasyimi Bin Omar
Inżynier oprogramowania
Jak wszyscy wielcy inżynierowie, Hairil jest zapalonym uczniem. Doskonali swoją wiedzę na temat C#, Pythona i Javy, wykorzystując tę wiedzę, aby dodawać wartości członkom zespołu Iron Software. Hairil dołączył do zespołu Iron Software z Universiti Teknologi MARA w Malezji, gdzie uzyskał tytuł licencjata ...
Czytaj więcej
Gotowy, aby rozpocząć?
Nuget Pliki do pobrania 2,240,258 | Wersja: 2026.5 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.