Jak odczytywać BarCodes z obiektów rysunkowych systemu

Jak odczytywać kody kreskowe z System.Drawing w C

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

IronBarcode umożliwia odczyt kodów kreskowych z obiektów System.Drawing na wszystkich systemach operacyjnych, automatycznie konwertując je na AnyBitmap za pomocą IronDrawing, rozwiązując problem ograniczenia Microsoftu do wsparcia System.Drawing tylko dla Windows.

Wprowadzenie

Obiekty System.Drawing są powszechnie stosowane w .NET do zadań przetwarzania obrazów. Jednakże, Microsoft zrezygnował z wsparcia dla System.Drawing na MacOS i Linux, obecnie wspierając jedynie Windows. Ta zmiana stwarza problemy dla deweloperów używających IronBarcode na systemach operacyjnych innych niż Windows, gdyż praca z kodami kreskowymi zazwyczaj obejmuje grafikę, obrazy i czcionki.

Aby rozwiązać ten problem, wprowadziliśmy IronDrawing. Ta bezpłatna i otwarta biblioteka, stworzona przez IronSoftware, ułatwia wsparcie międzyplatformowe i zapewnia płynne doświadczenie. Gdy instalujesz IronBarcode z NuGet, IronDrawing jest automatycznie dodawany do twojego projektu.

Dla deweloperów nowych w odczycie kodów kreskowych, zobacz nasz kompleksowy Poradnik Odczytywania Kodów Kreskowych obejmujący podstawowe pojęcia i wzorce użytkowania. Jeśli pracujesz z różnymi formatami obrazów, nasz przewodnik na temat odczytywania kodów kreskowych z obrazów zapewnia dodatkowy kontekst i przykłady.

Szybki start: Odczytaj kod kreskowy za pomoca AnyBitmap w jednym prostym wierszu

Ten fragment pokazuje, jak IronBarcode odczytuje kody kreskowe, tworząc System.Drawing.Bitmap i pozwalając IronDrawing na niejawne rzutowanie go na AnyBitmap. Zaledwie jedna linia pozwala deweloperom na dowolnym systemie operacyjnym uzyskać 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?

Odczyt kodów kreskowych z System.Drawing wymaga rzutowania obiektu na AnyBitmap. IronDrawing został zaprojektowany dla łatwości użytkowania i wspiera niejawne rzutowanie dla obiektów obrazów z System.Drawing na obiekty obrazów IronSoftware.Drawing nazwane AnyBitmap.

Poza obiektami System.Drawing, wspieramy rzutowanie z innych typow:

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

Zobacz ten przykład kodu do rzutowania powyższych obiektów. Poniżej demonstruje rzutowanie obrazów kodów kreskowych z obiektów System.Drawing na IronSoftware.Drawing.AnyBitmap:

Jakie 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 demonstruje bezproblemową integrację między obiektami System.Drawing i IronBarcode przez IronDrawing. Ta kompatybilność rozciąga się na różne formaty kodów kreskowych, szczegółowo opisane w naszym przewodniku po wspieranych formatach kodów kreskowych, w tym kodach QR, Code 128, Code 39 i wielu innych.

Dlaczego działa niejawne rzutowanie?

W powyższym kodzie załadowaliśmy dwa obrazy kodów kreskowych jako System.Drawing.Bitmap i System.Drawing.Image. Następnie niejawnie rzutowaliśmy je na AnyBitmap, przypisując do obiektów AnyBitmap, a potem dodaliśmy te obiekty do listy AnyBitmap.

Mechanizm niejawnego rzutowania IronDrawing wykorzystuje przeciążenie operatorów, zapewniając transparentną konwersję między typami System.Drawing a AnyBitmap. Ten wzorzec projektowy pozwala deweloperom utrzymywać istniejący kod przy jednoczesnym zyskaniu kompatybilności międzyplatformowej. Konwersja zachowuje wszystkie właściwości obrazu, w tym rozdzielczość, głębokość koloru i dane pikselowe, zapewniając brak utraty jakości.

Kiedy należy stosować jawne vs niejawne rzutowanie?

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

// 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ą powszechne błędy rzutowania?

Podczas konwersji System.Drawing na AnyBitmap, deweloperzy mogą napotkać:

  1. Wyjątki Null Reference: Zweryfikuj, czy twój obiekt System.Drawing nie jest null przed rzutowaniem
  2. Wyjątki Nieobsługiwany Format: Niektóre egzotyczne formaty obrazów wymagają wstępnej konwersji
  3. Problemy z Pamięcią: Duże obrazy wymagają właściwych wzorców zwalniania zasobów

W celu rozwiązywania problemów z rzutowaniem, nasz przewodnik rozwiązywania problemów zapewnia rozwiązania typowych problemów podczas rozpoznawania kodów kreskowych.

Jak czytać kody kreskowe z obiektów AnyBitmap?

IronBarcode akceptuje obiekty IronSoftware.Drawing.AnyBitmap we wszystkich metodach bez dodatkowej konfiguracji. To upraszcza tworzenie oprogramowania przy użyciu obiektów System.Drawing na systemach operacyjnych innych niż Windows. Poniższy kod to ilustruje:

Jakie metody akceptuja 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 zapewnia kilka metod akceptujących parametry AnyBitmap. Dla zaawansowanych scenariuszy, zobacz nasz przewodnik na temat odczytywania wielu kodów kreskowych prezentujący efektywne przetwarzanie wielu kodów kreskowych w jednym obrazie:

// Advanced barcode reading with options
var readerOptions = new BarcodeReaderOptions
{
    // Specify barcode types to search for
    ExpectBarcodeTypes = BarcodeEncoding.QRCode | BarcodeEncoding.Code128,
    // 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.Code128,
    // 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 obsługiwać wiele wyników kodu kreskowego?

Kod powyżej rozszerza poprzedni przykład. Po napełnieniu listy AnyBitmap, iterujemy przez nią i wywołujemy metodę Read na każdym obiekcie AnyBitmap, co zwróciło IronBarCode.BarcodeResults. Następnie iterujemy przez wyniki, aby wydrukować wartości kodów kreskowych na konsoli.

Podczas obsługi wielu kodów kreskowych wykorzystuj przetwarzanie równoległe do 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ć?

Funkcjonalność IronSoftware.Drawing wykracza poza rzutowanie obrazów. Obsługuje aspekty przetwarzania obrazów, takie jak kolory i czcionki, przydatne do stylizacji kodów kreskowych i kodów QR. Zbadaj, jak wykorzystujemy IronDrawing do dostosowywania i dodawania logo do kodów QR.

IronDrawing zapewnia potężne możliwości manipulacji obrazem, które uzupełniają przetwarzanie kodów kreskowych:

// 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.Contrast(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.Contrast(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 specyficznych korekcji obrazów, nasz przewodnik po korekcji obrazów szczegółowo opisuje użycie filtrów do zwiększenia czytelności kodu kreskowego.

Dlaczego warto wybrać IronDrawing zamiast System.Drawing?

IronDrawing oferuje atrakcyjne zalety w porównaniu do System.Drawing:

  1. Wsparcie międzyplatformowe: Działa bezproblemowo na Windows, Linux i macOS, w przeciwieństwie do System.Drawing (tylko Windows w .NET Core/5+)
  2. Nowoczesna architektura: Zbudowany na SkiaSharp i ImageSharp dla lepszej wydajności i zarządzania pamięcią
  3. Uproszczone API: Zachowuje znajome interfejsy przypominające System.Drawing, dodając nowoczesne udogodnienia
  4. Aktualny rozwój: Regularne aktualizacje i usprawnienia, w przeciwieństwie do System.Drawing w trybie utrzymania
  5. Lepsza integracja: Zaprojektowany specjalnie z myślą o optymalnej wydajności z produktami Iron Software

Dla rozważań wdrożeniowych, zwłaszcza dla środowisk chmurowych, zobacz nasze przewodniki na temat wdrażania na Azure i wdrażania na AWS, które zawierają specjalne notatki o zgodności międzyplatformowej z wykorzystaniem IronDrawing.

Niezależnie od tego, czy tworzysz aplikacje desktopowe, usługi webowe czy rozwiązania chmurowe, IronDrawing zapewnia, że twój kod przetwarzania kodów kreskowych pozostaje przenośny i wydajny na wszystkich platformach, czyniąc go idealnym wyborem dla nowoczesnego rozwoju .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.

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,145,441 | Wersja: 2026.4 just released
Still Scrolling Icon

Wciąż przewijasz?

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