Como Ler Códigos de Barras com System.Drawing em C
IronBarcode permite a leitura de códigos de barras a partir de objetos System.Drawing em todos os sistemas operacionais, convertendo-os automaticamente em AnyBitmap através de IronDrawing, resolvendo a limitação de suporte exclusivo para Windows da Microsoft para System.Drawing.
Introdução
Objetos System.Drawing são amplamente utilizados em .NET para tarefas de processamento de imagens. No entanto, a Microsoft descontinuou o suporte para System.Drawing no MacOS e Linux, agora suportando exclusivamente o Windows. Esta mudança criou problemas para desenvolvedores que usam IronBarcode em sistemas operacionais diferentes do Windows, já que trabalhar com códigos de barras normalmente envolve gráficos, imagens e fontes.
Para resolver este problema, introduzimos o IronDrawing. Esta biblioteca gratuita e de código aberto, criada pela IronSoftware, simplifica o suporte multiplataforma e proporciona uma experiência tranquila. Quando você instala o IronBarcode a partir do NuGet, IronDrawing é automaticamente incluído em seu projeto.
Para desenvolvedores novos na leitura de códigos de barras, veja nosso abrangente Tutorial de Leitura de Códigos de Barras que cobre conceitos fundamentais e padrões básicos de uso. Se você estiver trabalhando com vários formatos de imagem, nosso guia sobre ler códigos de barras a partir de imagens fornece contexto e exemplos adicionais.
Início Rápido: Leia um código de barras usando AnyBitmap em uma linha fácil
Este trecho mostra como o IronBarcode lê códigos de barras criando um System.Drawing.Bitmap e permitindo que o IronDrawing o converta implicitamente em AnyBitmap. Com apenas uma linha, os desenvolvedores em qualquer sistema operacional obtêm resultados rápidos.
-
Instale IronBarcode com o Gerenciador de Pacotes NuGet
PM > Install-Package BarCode -
Copie e execute este trecho de código.
var results = IronBarCode.BarcodeReader.Read((AnyBitmap)(new System.Drawing.Bitmap("yourImage.png"))); -
Implante para testar em seu ambiente de produção.
Comece a usar IronBarcode em seu projeto hoje com uma avaliação gratuita
- Baixar a biblioteca C# para ler códigos de barras a partir de `System.Drawing`
- Utilize o `IronDrawing` para converter objetos `System.Drawing` em `AnyBitmap`
- Use the `Read` method to read barcodes from `AnyBitmap` objects
- Exibir os valores dos códigos de barras detectados no console.
- Explore another article to learn how `IronDrawing` is used for handling color and fonts
Como Fazer a Conversão de Objetos System.Drawing para AnyBitmap?
A leitura de códigos de barras a partir de System.Drawing requer a conversão do objeto para AnyBitmap. IronDrawing foi projetado para ser fácil de usar e suporta a conversão implícita de objetos de imagem de System.Drawing em objetos de imagem IronSoftware.Drawing chamados AnyBitmap.
Além dos objetos System.Drawing, suportamos a conversão de outros tipos:
System.Drawing.BitmapSystem.Drawing.ImageSkiaSharp.SKBitmapSkiaSharp.SKImageSixLabors.ImageSharp
Veja este exemplo de código para converter os objetos acima. Abaixo, demonstra-se a conversão de imagens de código de barras de objetos System.Drawing em IronSoftware.Drawing.AnyBitmap:
Quais Tipos System.Drawing Podem Ser Convertidos?
: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)
Este código demonstra a integração perfeita entre objetos System.Drawing e IronBarcode através de IronDrawing. Esta compatibilidade se estende por vários formatos de código de barras, detalhados em nosso guia de formatos de código de barras suportados, incluindo códigos QR, Code 128, Code 39 e muitos outros.
Por que o Casting Implícito Funciona?
No código acima, carregamos duas imagens de código de barras como System.Drawing.Bitmap e System.Drawing.Image. Em seguida, as convertemos implicitamente em AnyBitmap ao atribuí-las a objetos AnyBitmap, depois adicionamos esses objetos a uma lista AnyBitmap.
O mecanismo de conversão implícita do IronDrawing usa sobrecarga de operador, proporcionando conversão transparente entre tipos System.Drawing e AnyBitmap. Este padrão de design permite que os desenvolvedores mantenham o código existente enquanto ganham compatibilidade entre plataformas. A conversão preserva todas as propriedades da imagem, incluindo resolução, profundidade de cor e dados de pixel, garantindo a ausência de perda de qualidade.
Quando Devo Usar Casting Implícito versus Explícito?
Embora o casting implícito proporcione conveniência, o casting explícito pode ser preferido em alguns cenários:
// 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
Quais São os Erros Comuns de Casting?
Ao converter System.Drawing para AnyBitmap, os desenvolvedores podem encontrar:
- Exceções de Referência Nula: Verifique se seu objeto
System.Drawingnão é nulo antes de converter - Exceções de Formato Não Suportado: Alguns formatos de imagem exóticos requerem pré-conversão
- Problemas de Memória: Imagens grandes precisam de padrões de descarte adequados
Para solucionar problemas de casting, nosso guia de solução de problemas fornece soluções para problemas comuns durante o reconhecimento de código de barras.
Como Ler Códigos de Barras de Objetos AnyBitmap?
O IronBarcode aceita objetos IronSoftware.Drawing.AnyBitmap em todos os métodos sem configuração adicional. Isso simplifica o desenvolvimento ao usar objetos System.Drawing em sistemas operacionais que não sejam o Windows. O código a seguir demonstra isso:
Quais Métodos Aceitam Parâmetros 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
Além do método básico Read, o IronBarcode fornece vários métodos que aceitam parâmetros AnyBitmap. Para cenários avançados, consulte nosso guia sobre leitura de múltiplos códigos de barras demonstrando o processamento eficiente de múltiplos códigos de barras em uma única imagem:
// 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)
Como Lidar com Resultados Múltiplos de Código de Barras?
O código acima estende o exemplo anterior. Após preencher a lista AnyBitmap, iteramos por ela e chamamos o método Read em cada objeto AnyBitmap, que retornou IronBarCode.BarcodeResults. Em seguida, iteramos pelos resultados para imprimir os valores dos códigos de barras no console.
Ao lidar com múltiplos códigos de barras, utilize processamento paralelo para melhor desempenho:
// 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
Quais Outras Funcionalidades IronDrawing Posso Usar?
A funcionalidade IronSoftware.Drawing se estende além da conversão de imagens. Ela lida com aspectos de processamento de imagem como cores e fontes, úteis para estilizar códigos de barras e códigos QR. Explore como utilizamos IronDrawing para personalizar e adicionar logotipos a códigos QR.
IronDrawing fornece poderosas capacidades de manipulação de imagem que complementam o processamento de códigos de barras:
// 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)
Para cenários que requerem correções específicas de imagem, nosso guia de correção de imagem detalha o uso de filtros para melhorar a legibilidade do código de barras.
Por Que Escolher IronDrawing ao Invés de System.Drawing?
IronDrawing oferece vantagens convincentes sobre System.Drawing:
- Suporte Multiplataforma: Funciona perfeitamente no Windows, Linux e macOS ao contrário de
System.Drawing(exclusivo para Windows no .NET Core/5+) - Arquitetura Moderna: Construído sobre
SkiaSharpeImageSharppara melhor desempenho e gestão de memória - API Simplificada: Mantém interfaces familiares ao
System.Drawingenquanto adiciona conveniências modernas - Desenvolvimento Ativo: Atualizações e melhorias regulares, ao contrário de
System.Drawingem modo de manutenção - Melhor Integração: Projetado especificamente para desempenho ótimo com produtos Iron Software
Para considerações de implantação, especialmente para ambientes de nuvem, consulte nossos guias sobre implantação no Azure e implantação no AWS, que incluem notas específicas sobre compatibilidade multiplataforma usando IronDrawing.
Seja construindo aplicativos desktop, serviços web ou soluções nativas em nuvem, IronDrawing garante que seu código de processamento de código de barras permaneça portátil e eficiente em todas as plataformas, tornando-o a escolha ideal para o desenvolvimento moderno em .NET.
Perguntas frequentes
Como posso ler códigos de barras de objetos System.Drawing em plataformas que não sejam Windows?
O IronBarcode lida automaticamente com a leitura de códigos de barras multiplataforma a partir de objetos System.Drawing por meio do IronDrawing, que os converte para o formato AnyBitmap. Isso resolve a limitação da Microsoft de o System.Drawing ser exclusivo do Windows, permitindo que você leia códigos de barras em sistemas macOS e Linux sem problemas.
O que é IronDrawing e por que está incluído na leitura de código de barras?
IronDrawing é uma biblioteca gratuita e de código aberto criada pela Iron Software que oferece suporte multiplataforma para operações gráficas. Ela é incluída automaticamente ao instalar o IronBarcode pelo NuGet e permite a leitura de códigos de barras de objetos System.Drawing em todos os sistemas operacionais, convertendo-os para o formato AnyBitmap compatível.
Como faço para converter um System.Drawing.Bitmap para que ele possa ler códigos de barras?
Você pode ler códigos de barras de System.Drawing.Bitmap com uma simples conversão para AnyBitmap: `var results = BarcodeReader.Read((AnyBitmap)(new System.Drawing.Bitmap("yourImage.png")));`. O IronBarcode lida com a conversão automaticamente por meio do recurso de conversão implícita do IronDrawing.
Posso ler códigos de barras no Linux e no MacOS usando System.Drawing?
Sim, o IronBarcode permite a leitura de códigos de barras de objetos System.Drawing no Linux e no macOS por meio do IronDrawing, que converte automaticamente objetos System.Drawing para o formato multiplataforma AnyBitmap. Isso supera a limitação da Microsoft de suporte exclusivo ao Windows para System.Drawing.
Que tipos de objetos System.Drawing podem ser usados para leitura de código de barras?
O IronBarcode suporta a leitura de códigos de barras de vários objetos System.Drawing, incluindo System.Drawing.Bitmap e outros tipos de imagem. Estes são convertidos automaticamente para AnyBitmap através do recurso de conversão implícita do IronDrawing, permitindo a funcionalidade de leitura de códigos de barras em várias plataformas.
Existe alguma solução simples, em uma única linha de código, para ler códigos de barras de um objeto System.Drawing?
Sim, o IronBarcode oferece uma solução de uma linha: `var results = BarcodeReader.Read((AnyBitmap)(new System.Drawing.Bitmap("yourImage.png")));`. Essa única linha cria um System.Drawing.Bitmap, converte-o para AnyBitmap através do IronDrawing e lê todos os códigos de barras presentes na imagem.

