Cómo Leer Códigos de Barras Desde Objetos del Sistema de Dibujo

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 permite leer códigos de barras de objetos System.Drawing en todos los sistemas operativos al convertirlos automáticamente a AnyBitmap a través de IronDrawing, resolviendo la limitación única de Windows de Microsoft para el soporte de System.Drawing.

Introducción

Los objetos System.Drawing son ampliamente utilizados en .NET para tareas de procesamiento de imágenes. Sin embargo, Microsoft ha descontinuado el soporte para System.Drawing en MacOS y Linux, ahora apoyando exclusivamente a Windows. Este cambio ha planteado problemas a los desarrolladores que utilizan IronBarcode en sistemas operativos distintos de Windows, ya que el trabajo con códigos de barras suele implicar gráficos, imágenes y tipos de letra.

Para solucionar este problema, presentamos IronDrawing. Esta biblioteca gratuita y de código abierto, creada por Iron Software, simplifica el soporte multiplataforma y proporciona una experiencia sin interrupciones. Cuando instalas IronBarcode desde NuGet, IronDrawing se incluye automáticamente en tu proyecto.

Para los desarrolladores que no estén familiarizados con la lectura de códigos de barras, consulte nuestro completo Tutorial de lectura de códigos de barras, que cubre los conceptos fundamentales y los patrones de uso básicos. Si trabaja con varios formatos de imagen, nuestra guía sobre lectura de códigos de barras a partir de imágenes proporciona contexto y ejemplos adicionales.

Inicio rápido: Leer un código de barras usando AnyBitmap en una línea fácil

Este fragmento muestra cómo IronBarcode lee códigos de barras creando un System.Drawing.Bitmap y permitiendo que IronDrawing lo transforme implícitamente a AnyBitmap. Con una sola línea, los desarrolladores de cualquier sistema operativo obtienen resultados rápidos.

  1. Instala IronBarcode con el Administrador de Paquetes NuGet

    PM > Install-Package BarCode
  2. Copie y ejecute este fragmento de código.

    var results = IronBarCode.BarcodeReader.Read((AnyBitmap)(new System.Drawing.Bitmap("yourImage.png")));
  3. Despliegue para probar en su entorno real

    Comienza a usar IronBarcode en tu proyecto hoy mismo con una prueba gratuita

    arrow pointer

¿Cómo convierto objetos System.Drawing a AnyBitmap?

Leer códigos de barras de System.Drawing requiere transformar el objeto a AnyBitmap. IronDrawing fue diseñado para facilidad de uso y soporta la conversión implícita para objetos de imagen de System.Drawing en objetos de imágenes IronSoftware.Drawing llamados AnyBitmap.

Más allá de los objetos System.Drawing, soportamos la conversión desde otros tipos:

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

Consulte este ejemplo de código para convertir los objetos anteriores. A continuación se muestra la conversión de imágenes de códigos de barras desde objetos System.Drawing a IronSoftware.Drawing.AnyBitmap:

¿Cuáles tipos de System.Drawing pueden 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)
$vbLabelText   $csharpLabel

Este código demuestra la integración perfecta entre objetos System.Drawing y IronBarcode a través de IronDrawing. Esta compatibilidad se extiende a varios formatos de códigos de barras, detallados en nuestra guía de formatos de códigos de barras compatibles, incluidos los códigos QR, Code 128, Code 39 y muchos otros.

¿Por qué funciona el colado implícito?

En el código anterior, cargamos dos imágenes de códigos de barras como System.Drawing.Bitmap y System.Drawing.Image. Luego, los transformamos implícitamente a AnyBitmap asignándolos a objetos AnyBitmap, luego agregamos estos objetos a una lista AnyBitmap.

El mecanismo de conversión implícita de IronDrawing utiliza sobrecarga de operadores, proporcionando una conversión transparente entre tipos de System.Drawing y AnyBitmap. Este patrón de diseño permite a los desarrolladores mantener el código existente al tiempo que obtienen compatibilidad entre plataformas. La conversión conserva todas las propiedades de la imagen, incluida la resolución, la profundidad de color y los datos de píxeles, lo que garantiza que no se pierda calidad.

¿Cuándo se debe utilizar el casting explícito frente al implícito?

Aunque la conversión implícita resulta práctica, en algunos casos puede ser preferible la conversión explícita:

// 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

¿Cuáles son los errores de fundición más comunes?

Al convertir System.Drawing a AnyBitmap, los desarrolladores podrían encontrarse con:

  1. Excepciones de referencia nula: Verifica que tu objeto System.Drawing no sea nulo antes de convertir
  2. Excepciones de formatos no compatibles: Algunos formatos de imagen exóticos requieren una conversión previa
  3. Cuestiones de memoria: Las imágenes de gran tamaño necesitan patrones de eliminación adecuados

Para solucionar problemas de fundición, nuestra guía de solución de problemas ofrece soluciones a problemas comunes durante el reconocimiento de códigos de barras.

¿Cómo leo códigos de barras de objetos AnyBitmap?

IronBarcode acepta objetos IronSoftware.Drawing.AnyBitmap en todos los métodos sin configuración adicional. Esto simplifica el desarrollo cuando se usan objetos de System.Drawing en sistemas operativos que no son Windows. El siguiente código demuestra esto:

¿Qué métodos aceptan 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
$vbLabelText   $csharpLabel

Más allá del método básico Read, IronBarcode proporciona varios métodos que aceptan parámetros AnyBitmap. Para escenarios avanzados, consulte nuestra guía sobre lectura de múltiples códigos de barras que demuestra el procesamiento eficiente de múltiples códigos de barras en una sola imagen:

// 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

¿Cómo manejar múltiples resultados de códigos de barras?

El código anterior amplía el ejemplo anterior. Después de completar la lista AnyBitmap, iteramos sobre ella y llamamos al método Read en cada objeto AnyBitmap, que devolvió IronBarCode.BarcodeResults. A continuación, iteramos sobre los resultados para imprimir los valores de los códigos de barras en la consola.

Al gestionar varios códigos de barras, aproveche el procesamiento en paralelo para mejorar el rendimiento:

// 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

¿Qué otras características de IronDrawing puedo usar?

La funcionalidad de IronSoftware.Drawing se extiende más allá de la conversión de imágenes. Maneja aspectos de procesamiento de imágenes como colores y fuentes útiles para estilizar códigos de barras y códigos QR. Explora cómo utilizamos IronDrawing para personalizar y añadir logotipos a los códigos QR.

IronDrawing proporciona potentes capacidades de manipulación de imágenes que complementan el procesamiento 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)
$vbLabelText   $csharpLabel

Para situaciones que requieran correcciones de imagen específicas, nuestra guía de corrección de imágenes detalla el uso de filtros para mejorar la legibilidad de los códigos de barras.

¿Por qué elegir IronDrawing sobre System.Drawing?

IronDrawing ofrece ventajas convincentes sobre System.Drawing:

  1. Soporte multiplataforma: Funciona sin problemas en Windows, Linux y macOS a diferencia de System.Drawing (solo Windows en .NET Core/5+)
  2. Arquitectura moderna: Construido sobre SkiaSharp y ImageSharp para un mejor rendimiento y gestión de memoria
  3. API simplificada: Mantiene interfaces similares a System.Drawing añadiendo comodidades modernas
  4. Desarrollo activo: Actualizaciones y mejoras regulares, a diferencia de System.Drawing que está en modo de mantenimiento
  5. Mejor integración: Diseñado específicamente para un rendimiento óptimo con los productos de Iron Software

Para consideraciones de implementación, especialmente para entornos en la nube, consulta nuestras guías sobre implementación en Azure e implementación en AWS que incluyen notas específicas sobre la compatibilidad multiplataforma utilizando IronDrawing.

Ya sea creando aplicaciones de escritorio, servicios web o soluciones nativas de la nube, IronDrawing asegura que tu código de procesamiento de códigos de barras permanezca portátil y eficiente en todas las plataformas, convirtiéndose en la elección ideal para el desarrollo moderno en .NET.

Preguntas Frecuentes

¿Cómo puedo leer códigos de barras a partir de objetos System.Drawing en plataformas distintas de Windows?

IronBarcode gestiona automáticamente la lectura de códigos de barras multiplataforma a partir de objetos System.Drawing mediante IronDrawing, que los convierte al formato AnyBitmap. Esto resuelve la limitación de Microsoft de que System.Drawing sea exclusivo de Windows, permitiéndole leer códigos de barras en sistemas MacOS y Linux sin problemas.

¿Qué es IronDrawing y por qué se incluye con la lectura de códigos de barras?

IronDrawing es una biblioteca gratuita de código abierto creada por Iron Software que proporciona soporte multiplataforma para operaciones gráficas. Se incluye automáticamente al instalar IronBarcode desde NuGet y permite la lectura de códigos de barras a partir de objetos System.Drawing en todos los sistemas operativos convirtiéndolos al formato compatible AnyBitmap.

¿Cómo convierto un System.Drawing.Bitmap para leer códigos de barras de él?

Puede leer códigos de barras de System.Drawing.Bitmap con una simple conversión a AnyBitmap: `var results = BarcodeReader.Read((AnyBitmap)(new System.Drawing.Bitmap("yourImage.png")));`. IronBarcode maneja la conversión automáticamente a través de la función de fundición implícita de IronDrawing.

¿Puedo leer códigos de barras en Linux y MacOS utilizando System.Drawing?

Sí, IronBarcode permite la lectura de códigos de barras a partir de objetos System.Drawing en Linux y MacOS a través de IronDrawing, que convierte automáticamente los objetos System.Drawing al formato multiplataforma AnyBitmap. De este modo se supera la limitación de Microsoft de admitir sólo Windows para System.Drawing.

¿Qué tipos de objetos System.Drawing pueden utilizarse para la lectura de códigos de barras?

IronBarcode soporta la lectura de códigos de barras desde varios objetos System.Drawing incluyendo System.Drawing.Bitmap y otros tipos de imágenes. Estos se convierten automáticamente a AnyBitmap a través de la función de fundición implícita de IronDrawing, lo que permite la funcionalidad de lectura de códigos de barras multiplataforma.

¿Existe una solución sencilla de una sola línea para leer códigos de barras desde System.Drawing?

Sí, IronBarcode proporciona una solución de una sola línea: `var results = BarcodeReader.Read((AnyBitmap)(new System.Drawing.Bitmap("yourImage.png")));`. Esta única línea crea un System.Drawing.Bitmap, lo convierte en AnyBitmap a través de IronDrawing, y lee todos los códigos de barras presentes en la imagen.

¿IronBarcode proporciona soporte para personalizar la apariencia de los códigos de barras?

Sí, IronBarcode proporciona amplias opciones de personalización para la apariencia de los códigos de barras, incluidas color, tamaño y anotaciones de texto, permitiéndote adaptar los códigos de barras a tus requisitos de diseño específicos.

¿Cómo puede IronBarcode ayudar a mejorar la eficiencia de los procesos de negocio?

IronBarcode mejora la eficiencia de los procesos de negocio al permitir la generación y lectura rápida y precisa de códigos de barras, reduciendo errores de entrada de datos manuales y mejorando el seguimiento de inventario y activos.

¿Qué habilidades de programación se necesitan para implementar IronBarcode en un proyecto?

El conocimiento básico de programación en C# es suficiente para implementar IronBarcode en un proyecto, ya que proporciona métodos sencillos y documentación completa para guiar a los desarrolladores.

¿Es IronBarcode adecuado para tanto proyectos pequeños como aplicaciones empresariales grandes?

IronBarcode está diseñado para ser escalable y versátil, haciéndolo adecuado para proyectos pequeños, así como para aplicaciones empresariales grandes que requieren soluciones robustas de códigos de barras.

Hairil Hasyimi Bin Omar
Ingeniero de Software
Como todos los grandes ingenieros, Hairil es un ávido aprendiz. Está refinando su conocimiento de C#, Python y Java, usando ese conocimiento para agregar valor a los miembros del equipo en Iron Software. Hairil se unió al equipo de Iron Software desde la Universiti Teknologi MARA en Malasia, donde se ...
Leer más
¿Listo para empezar?
Nuget Descargas 2,240,258 | Versión: 2026.5 just released
Still Scrolling Icon

¿Aún desplazándote?

¿Quieres una prueba rápida? PM > Install-Package BarCode
ejecuta una muestra observa cómo tu cadena se convierte en un código de barras.