Cómo Configurar una Región de Recorte de Código de Barras en C#
Migrating from Código de barras de red to IronBarcode
Esta guía abarca la ruta de migración completa de Código de barras de red a IronBarcode , con pasos para eliminar paquetes, actualizaciones de espacios de nombres, ejemplos de traducción de API y una lista de verificación para localizar cada punto de llamada antes de que comience la migración. La guía aborda el escenario común en el que un proyecto comienza con Código de barras de red para generación de códigos de barras 1D y luego requiere formatos 2D, capacidad de lectura o aclaración de la obligación de licencia de SixLabors.ImageSharp, todo lo cual está fuera del alcance de NetBarcode.
¿Por qué migrar desde NetBarcode?
Límite de formato: El enum Type de Código de barras de red define exactamente 11 formatos de código de barras, todos lineales. No hay ninguna entrada para código QR, DataMatrix, PDF417 o Aztec. Cuando un proyecto añade el requisito de incluir un código QR, ya sea para enlaces de entrega sin contacto, enlaces directos para dispositivos móviles o un requisito de DataMatrix para la industria farmacéutica, Código de barras de red no puede satisfacerlo. La única solución dentro del diseño de la biblioteca es dejar de usarla para ese formato e introducir un paquete aparte. Cada requisito de formato adicional que cae fuera del enum de 11 entradas agrega otra biblioteca al árbol de dependencias.
Sin API de lectura: Código de barras de red genera imágenes de códigos de barras y no proporciona ningún método para decodificarlas. Un proyecto que necesite escanear etiquetas de envío de devolución, extraer valores de códigos de barras de facturas de proveedores o validar que un código de barras impreso coincida con sus datos de origen debe agregar una biblioteca de lectura independiente. La opción más común es integrar ZX en .NET , introduciendo una tercera interfaz API en un código base que ya contiene Código de barras de red y, normalmente, una biblioteca específica para códigos QR.
Licencia Comercial de ImageSharp: Código de barras de red depende de SixLabors.ImageSharp, que utiliza una licencia comercial dividida. El nivel gratuito se aplica a proyectos de código abierto y a empresas con ingresos anuales inferiores a un umbral definido. por encima de ese umbral se requiere una licencia comercial. Esta condición está integrada en la cadena de dependencias transitivas y NuGet no la detecta durante la instalación. Una empresa minorista o de logística que procese códigos de barras a gran escala —precisamente el caso de uso al que apunta NetBarcode— puede estar operando por encima del umbral sin haber evaluado la obligación.
Acumulación de múltiples bibliotecas: Los proyectos que recurren a QRCoder cuando se necesitan códigos QR y luego a ZXing .NET cuando se requiere lectura, acumulan tres dependencias separadas relacionadas con códigos de barras. Cada una tiene su propio calendario de lanzamientos, sus propias expectativas de versión de ImageSharp y su propia API que mantener. La consolidación en una única biblioteca que abarque la generación, la lectura, las imágenes 1D y 2D elimina el problema de la gestión de versiones entre diferentes bibliotecas.
El problema fundamental
Un proyecto que comienza solo con Código de barras de red y luego crece hasta requerir formatos 2D termina con este tipo de importación dividida:
// Código de barras de red for 1D — one library, one API
using NetBarcode;
var code128 = new Barcode("12345", Type.Code128);
code128.SaveImageFile("label.png");
// QRCoder added separately for QR — second library, second API
using QRCoder;
var qrGenerator = new QRCodeGenerator();
var qrData = qrGenerator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M);
var png = new PngByteQRCode(qrData).GetGraphic(20);
File.WriteAllBytes("qr.png", png);
// Código de barras de red for 1D — one library, one API
using NetBarcode;
var code128 = new Barcode("12345", Type.Code128);
code128.SaveImageFile("label.png");
// QRCoder added separately for QR — second library, second API
using QRCoder;
var qrGenerator = new QRCodeGenerator();
var qrData = qrGenerator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M);
var png = new PngByteQRCode(qrData).GetGraphic(20);
File.WriteAllBytes("qr.png", png);
Imports NetBarcode
Imports QRCoder
Imports System.IO
' Código de barras de red for 1D — one library, one API
Dim code128 As New Barcode("12345", Type.Code128)
code128.SaveImageFile("label.png")
' QRCoder added separately for QR — second library, second API
Dim qrGenerator As New QRCodeGenerator()
Dim qrData As QRCodeData = qrGenerator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M)
Dim png As Byte() = New PngByteQRCode(qrData).GetGraphic(20)
File.WriteAllBytes("qr.png", png)
Tras migrar a IronBarcode, se obtienen los mismos dos resultados con una sola importación:
using IronBarCode;
BarcodeWriter.CreateBarcode("12345", BarcodeEncoding.Code128)
.SaveAsPng("label.png");
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
.SaveAsPng("qr.png");
using IronBarCode;
BarcodeWriter.CreateBarcode("12345", BarcodeEncoding.Code128)
.SaveAsPng("label.png");
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
.SaveAsPng("qr.png");
Imports IronBarCode
BarcodeWriter.CreateBarcode("12345", BarcodeEncoding.Code128) _
.SaveAsPng("label.png")
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode) _
.SaveAsPng("qr.png")
IronBarcode vs NetBarcode: Comparación de características
| Característica | Código de barras de red | IronBarcode |
|---|---|---|
| Generación de códigos de barras 1D | Sí | Sí |
| Generación de códigos de barras 2D (QR, DataMatrix, PDF417, Aztec) | No | Sí |
| Lectura de códigos de barras a partir de imágenes | No | Sí |
| Lectura de códigos de barras en documentos PDF | No | Sí |
| Recuento de formato 1D | 11 | 30+ |
| Recuento de formato 2D | 0 | 8+ |
| Simbologías totales | 11 | Más de 50 |
| GS1-128, GS1 DataBar | No | Sí |
| Formatos postales | No | Sí |
| Salida SVG | No | Sí |
| Procesamiento por lotes | Manual | Incorporado en |
| Dependencia de ImageSharp | Sí (licencia dividida) | No |
| Apoyo comercial | Comunidad | Profesional |
| Modelo de licencia | MIT (+ condiciones de ImageSharp) | Comercial |
Inicio rápido: Migración de Código de barras de red a IronBarcode
Paso 1: Sustituir el paquete NuGet
Elimine Código de barras de red y su dependencia transitiva de ImageSharp:
dotnet remove package NetBarcode
dotnet remove package SixLabors.ImageSharp
dotnet remove package NetBarcode
dotnet remove package SixLabors.ImageSharp
Tenga en cuenta que SixLabors.ImageSharp puede reaparecer en la lista de paquetes restaurados si otros paquetes en el proyecto también lo referencian de forma transitiva. Después de la eliminación, ejecute dotnet list package --include-transitive para confirmar si ImageSharp permanece y si su condición de licencia comercial aún se aplica al proyecto.
Paso 2: Añadir IronBarcode
dotnet add package IronBarcode
dotnet add package IronBarcode
El nombre del paquete NuGet es IronBarcode; el espacio de nombres utilizado en el código es IronBarCode (note la C mayúscula).
Paso 3: Actualizar los espacios de nombres e inicializar la licencia.
Reemplace las directivas using antiguas en cada archivo que contenía llamadas a NetBarcode:
// Eliminar these:
// using NetBarcode;
// using SixLabors.ImageSharp;
// using SixLabors.ImageSharp.PixelFormats;
// using SixLabors.Fonts;
// Add this:
using IronBarCode;
// Eliminar these:
// using NetBarcode;
// using SixLabors.ImageSharp;
// using SixLabors.ImageSharp.PixelFormats;
// using SixLabors.Fonts;
// Add this:
using IronBarCode;
Imports IronBarCode
Agregue la inicialización de la licencia una vez en el inicio de la aplicación — en Program.cs, Startup.cs, o el punto de entrada del proyecto:
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
Hay disponible una clave de prueba gratuita para su evaluación; La compra de una licencia elimina la marca de agua de prueba de las imágenes de códigos de barras generadas.
Ejemplos de migración de código
Generación de código 128
El patrón de uso más común de Código de barras de red se traduce directamente a IronBarcode con un cambio de constructor a método estático y un cambio de nombre del método.
Enfoque de NetBarcode:
using NetBarcode;
var barcode = new Barcode("12345678901234", Type.Code128);
barcode.SaveImageFile("shipping-label.png");
using NetBarcode;
var barcode = new Barcode("12345678901234", Type.Code128);
barcode.SaveImageFile("shipping-label.png");
Imports NetBarcode
Dim barcode As New Barcode("12345678901234", Type.Code128)
barcode.SaveImageFile("shipping-label.png")
Enfoque de IronBarcode :
using IronBarCode;
BarcodeWriter.CreateBarcode("12345678901234", BarcodeEncoding.Code128)
.SaveAsPng("shipping-label.png");
using IronBarCode;
BarcodeWriter.CreateBarcode("12345678901234", BarcodeEncoding.Code128)
.SaveAsPng("shipping-label.png");
Imports IronBarCode
BarcodeWriter.CreateBarcode("12345678901234", BarcodeEncoding.Code128) _
.SaveAsPng("shipping-label.png")
El constructor new Barcode(data, Type.X) se convierte en BarcodeWriter.CreateBarcode(data, BarcodeEncoding.X). El método SaveImageFile() se convierte en SaveAsPng(), SaveAsJpeg(), o SaveAsWindowsBitmap() dependiendo del formato de salida requerido. Todas las opciones disponibles para la generación de códigos de barras 1D están documentadas en las guías prácticas de IronBarcode .
EAN-13
Los tipos de códigos de barras de productos minoristas se asignan directamente entre bibliotecas mediante un cambio de nombre de constante y un cambio de nombre de método.
Enfoque de NetBarcode:
using NetBarcode;
var ean13 = new Barcode("5901234123457", Type.EAN13);
ean13.SaveImageFile("product-ean.png");
using NetBarcode;
var ean13 = new Barcode("5901234123457", Type.EAN13);
ean13.SaveImageFile("product-ean.png");
Imports NetBarcode
Dim ean13 As New Barcode("5901234123457", Type.EAN13)
ean13.SaveImageFile("product-ean.png")
Enfoque de IronBarcode :
using IronBarCode;
BarcodeWriter.CreateBarcode("5901234123457", BarcodeEncoding.EAN13)
.SaveAsPng("product-ean.png");
using IronBarCode;
BarcodeWriter.CreateBarcode("5901234123457", BarcodeEncoding.EAN13)
.SaveAsPng("product-ean.png");
Imports IronBarCode
BarcodeWriter.CreateBarcode("5901234123457", BarcodeEncoding.EAN13) _
.SaveAsPng("product-ean.png")
Los nombres de las constantes de codificación coinciden con los nombres de los miembros de enum Type de Código de barras de red donde existen equivalentes directos. Tenga en cuenta que UPC-A (Type.UPCA), UPC-E (Type.UPCE), ITF (Type.ITF), y MSI (Type.MSI) no son parte del enum Type de Código de barras de red — si esos formatos son necesarios, IronBarcode los soporta nativamente a través de BarcodeEncoding.UPCA, BarcodeEncoding.UPCE, BarcodeEncoding.ITF, y BarcodeEncoding.MSI.
ObtenerImagen() a ToPngBinaryData()
El método GetImage() de Código de barras de red devuelve SixLabors.ImageSharp.Image<Rgba32>, lo que requiere importaciones explícitas de ImageSharp en el código de llamada y vincula la lógica descendente a la API de ImageSharp. IronBarcode expone métodos de salida binaria y de flujo directamente en el objeto GeneratedBarcode, eliminando por completo la dependencia de ImageSharp del código de llamada.
Enfoque de NetBarcode:
using NetBarcode;
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.PixelFormats;
var barcode = new Barcode("12345", Type.Code128);
Image<Rgba32> image = barcode.GetImage();
using var stream = new MemoryStream();
image.SaveAsPng(stream);
byte[] bytes = stream.ToArray();
using NetBarcode;
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.PixelFormats;
var barcode = new Barcode("12345", Type.Code128);
Image<Rgba32> image = barcode.GetImage();
using var stream = new MemoryStream();
image.SaveAsPng(stream);
byte[] bytes = stream.ToArray();
Imports NetBarcode
Imports SixLabors.ImageSharp
Imports SixLabors.ImageSharp.PixelFormats
Imports System.IO
Dim barcode As New Barcode("12345", Type.Code128)
Dim image As Image(Of Rgba32) = barcode.GetImage()
Using stream As New MemoryStream()
image.SaveAsPng(stream)
Dim bytes As Byte() = stream.ToArray()
End Using
Enfoque de IronBarcode :
using IronBarCode;
var barcode = BarcodeWriter.CreateBarcode("12345", BarcodeEncoding.Code128);
// Retrieve bytes directly — no ImageSharp type in calling code
byte[] bytes = barcode.ToPngBinaryData();
// Or write to a stream directly
using var stream = new MemoryStream();
barcode.SaveAsPng(stream);
using IronBarCode;
var barcode = BarcodeWriter.CreateBarcode("12345", BarcodeEncoding.Code128);
// Retrieve bytes directly — no ImageSharp type in calling code
byte[] bytes = barcode.ToPngBinaryData();
// Or write to a stream directly
using var stream = new MemoryStream();
barcode.SaveAsPng(stream);
Imports IronBarCode
Dim barcode = BarcodeWriter.CreateBarcode("12345", BarcodeEncoding.Code128)
' Retrieve bytes directly — no ImageSharp type in calling code
Dim bytes As Byte() = barcode.ToPngBinaryData()
' Or write to a stream directly
Using stream As New MemoryStream()
barcode.SaveAsPng(stream)
End Using
El código que realizaba manipulaciones adicionales de ImageSharp en el resultado Image<Rgba32> — redimensionamiento, composición, conversión de formato — necesitará que esas operaciones se evalúen individualmente, ya que IronBarcode no expone un objeto ImageSharp.
Reemplazar Código de barras de red y QRCoder juntos
Los proyectos que utilizan Código de barras de red junto con QRCoder pueden reemplazar ambos a la vez. La generación 2D de IronBarcode utiliza el mismo método BarcodeWriter.CreateBarcode que su generación 1D; solo difiere la constante BarcodeEncoding. Consulte la guía de generación de códigos de barras 2D para obtener información sobre las opciones de codificación y configuración.
Enfoque de Código de barras de red y QRCoder:
using NetBarcode;
using QRCoder;
// 1D with NetBarcode
var code128 = new Barcode("12345", Type.Code128);
code128.SaveImageFile("label.png");
// QR with QRCoder
var qrGenerator = new QRCodeGenerator();
var qrData = qrGenerator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M);
var qrCode = new PngByteQRCode(qrData);
File.WriteAllBytes("qr.png", qrCode.GetGraphic(20));
using NetBarcode;
using QRCoder;
// 1D with NetBarcode
var code128 = new Barcode("12345", Type.Code128);
code128.SaveImageFile("label.png");
// QR with QRCoder
var qrGenerator = new QRCodeGenerator();
var qrData = qrGenerator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M);
var qrCode = new PngByteQRCode(qrData);
File.WriteAllBytes("qr.png", qrCode.GetGraphic(20));
Imports NetBarcode
Imports QRCoder
' 1D with NetBarcode
Dim code128 As New Barcode("12345", Type.Code128)
code128.SaveImageFile("label.png")
' QR with QRCoder
Dim qrGenerator As New QRCodeGenerator()
Dim qrData = qrGenerator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M)
Dim qrCode As New PngByteQRCode(qrData)
File.WriteAllBytes("qr.png", qrCode.GetGraphic(20))
Enfoque de IronBarcode :
using IronBarCode;
// 1D — same API as 2D
BarcodeWriter.CreateBarcode("12345", BarcodeEncoding.Code128)
.SaveAsPng("label.png");
// QR — change the encoding constant, nothing else
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
.SaveAsPng("qr.png");
// Additional 2D formats available with no further imports
BarcodeWriter.CreateBarcode("01034531200000111719112510ABCD1234", BarcodeEncoding.DataMatrix)
.SaveAsPng("pharma-label.png");
using IronBarCode;
// 1D — same API as 2D
BarcodeWriter.CreateBarcode("12345", BarcodeEncoding.Code128)
.SaveAsPng("label.png");
// QR — change the encoding constant, nothing else
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
.SaveAsPng("qr.png");
// Additional 2D formats available with no further imports
BarcodeWriter.CreateBarcode("01034531200000111719112510ABCD1234", BarcodeEncoding.DataMatrix)
.SaveAsPng("pharma-label.png");
Imports IronBarCode
' 1D — same API as 2D
BarcodeWriter.CreateBarcode("12345", BarcodeEncoding.Code128) _
.SaveAsPng("label.png")
' QR — change the encoding constant, nothing else
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode) _
.SaveAsPng("qr.png")
' Additional 2D formats available with no further imports
BarcodeWriter.CreateBarcode("01034531200000111719112510ABCD1234", BarcodeEncoding.DataMatrix) _
.SaveAsPng("pharma-label.png")
Agregar capacidad de lectura
Si el proyecto también utiliza ZXing .NET para la lectura, esa dependencia se puede eliminar junto con NetBarcode. El BarcodeReader de IronBarcode maneja imágenes y documentos PDF con detección de formato automática.
Enfoque ZXing .NET :
using ZXing;
using ZXing.Common;
using ZXing.Rendering;
var reader = new BarcodeReaderGeneric();
reader.Options = new DecodingOptions { TryHarder = true };
// Bitmap loading and format-specific handling required before decode call
using ZXing;
using ZXing.Common;
using ZXing.Rendering;
var reader = new BarcodeReaderGeneric();
reader.Options = new DecodingOptions { TryHarder = true };
// Bitmap loading and format-specific handling required before decode call
Imports ZXing
Imports ZXing.Common
Imports ZXing.Rendering
Dim reader = New BarcodeReaderGeneric()
reader.Options = New DecodingOptions With {.TryHarder = True}
' Bitmap loading and format-specific handling required before decode call
Enfoque de IronBarcode :
using IronBarCode;
// Read from an image file — automatic format detection
var imageResults = BarcodeReader.Read("shipping-label.png");
foreach (var r in imageResults)
{
Console.WriteLine($"{r.Format}: {r.Value}");
}
// Read from a PDF document — no separate PDF library needed
var pdfResults = BarcodeReader.Read("supplier-invoice.pdf");
foreach (var r in pdfResults)
{
Console.WriteLine($"Page {r.PageNumber}: {r.Format}: {r.Value}");
}
using IronBarCode;
// Read from an image file — automatic format detection
var imageResults = BarcodeReader.Read("shipping-label.png");
foreach (var r in imageResults)
{
Console.WriteLine($"{r.Format}: {r.Value}");
}
// Read from a PDF document — no separate PDF library needed
var pdfResults = BarcodeReader.Read("supplier-invoice.pdf");
foreach (var r in pdfResults)
{
Console.WriteLine($"Page {r.PageNumber}: {r.Format}: {r.Value}");
}
Imports IronBarCode
' Read from an image file — automatic format detection
Dim imageResults = BarcodeReader.Read("shipping-label.png")
For Each r In imageResults
Console.WriteLine($"{r.Format}: {r.Value}")
Next
' Read from a PDF document — no separate PDF library needed
Dim pdfResults = BarcodeReader.Read("supplier-invoice.pdf")
For Each r In pdfResults
Console.WriteLine($"Page {r.PageNumber}: {r.Format}: {r.Value}")
Next
La documentación completa sobre las opciones de lectura está disponible en la guía de lectura de códigos de barras a partir de imágenes , que abarca el ajuste de velocidad, la detección de múltiples códigos de barras y la configuración de corrección de imágenes.
Referencia de mapeo de la API de Código de barras de red a IronBarcode
| Código de barras de red | IronBarcode | Notas |
|---|---|---|
new Barcode(data, Type.Code128) |
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128) |
Constructor → método estático |
new Barcode(data, Type.EAN13) |
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.EAN13) |
Mapeo directo |
new Barcode(data, Type.Code39) |
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code39) |
Mapeo directo |
new Barcode(data, Type.EAN8) |
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.EAN8) |
Mapeo directo |
new Barcode(data, Type.Codabar) |
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Codabar) |
Mapeo directo |
new Barcode(data, Type.Code93) |
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code93) |
Mapeo directo |
barcode.SaveImageFile("x.png") |
.SaveAsPng("x.png") |
renombrar método |
barcode.SaveImageFile("x.jpg") |
.SaveAsJpeg("x.jpg") |
renombrar método |
barcode.GetImage() → Image<Rgba32> |
.ToPngBinaryData() o .SaveAsPng() |
No se muestra ningún tipo ImageSharp |
No Type.QRCode |
BarcodeEncoding.QRCode |
Nueva capacidad |
No Type.DataMatrix |
BarcodeEncoding.DataMatrix |
Nueva capacidad |
No Type.PDF417 |
BarcodeEncoding.PDF417 |
Nueva capacidad |
No Type.Aztec |
BarcodeEncoding.Aztec |
Nueva capacidad |
| No se puede leer la API | BarcodeReader.Read(path) |
Nueva capacidad |
using NetBarcode; |
using IronBarCode; |
Reemplazo de espacio de nombres |
using SixLabors.ImageSharp; |
Eliminar | Ya no es necesario |
using SixLabors.ImageSharp.PixelFormats; |
Eliminar | Ya no es necesario |
using SixLabors.Fonts; |
Eliminar | Ya no es necesario |
La lista completa de constantes de codificación se encuentra en la referencia de formatos de código de barras compatibles .
Problemas comunes de migración y soluciones
Problema 1: La dependencia transitiva de ImageSharp persiste tras la eliminación del paquete.
Problema: Después de ejecutar dotnet remove package NetBarcode, dotnet restore muestra que SixLabors.ImageSharp aún está presente en el árbol de dependencias porque otro paquete en el proyecto también lo referencia.
Solución: Ejecute dotnet list package --include-transitive para identificar qué paquete aún está trayendo ImageSharp. Si solo es NetBarcode, eliminar la referencia explícita del paquete y restaurar debería eliminarlo. Si otro paquete es responsable, la dependencia de ImageSharp de ese paquete y su condición de licencia comercial permanecen en alcance independientemente de la eliminación de NetBarcode.
dotnet list package --include-transitive | grep -i imagesharp
dotnet list package --include-transitive | grep -i imagesharp
Número 2: Imagen El tipo no se puede resolver después de la eliminación.
Problema: Después de eliminar el paquete SixLabors.ImageSharp, cualquier variable declarada como Image<Rgba32> o parámetro tipado como SixLabors.ImageSharp.Image<Rgba32> produce un error de compilación porque el tipo ya no está disponible.
Solución: Reemplace cada uso con el método de salida IronBarcode apropiado. Si la variable se utilizaba para obtener bytes, reemplácela por .ToPngBinaryData(). Si se escribía en un flujo, reemplácela por .SaveAsPng(stream). Si se guardaba en un archivo, reemplácela por .SaveAsPng(path).
// Before — requires SixLabors.ImageSharp reference
Image<Rgba32> img = barcode.GetImage();
img.SaveAsPng(stream);
// After — no external image type required
barcode.SaveAsPng(stream);
// Before — requires SixLabors.ImageSharp reference
Image<Rgba32> img = barcode.GetImage();
img.SaveAsPng(stream);
// After — no external image type required
barcode.SaveAsPng(stream);
' Before — requires SixLabors.ImageSharp reference
Dim img As Image(Of Rgba32) = barcode.GetImage()
img.SaveAsPng(stream)
' After — no external image type required
barcode.SaveAsPng(stream)
Problema 3: v1.8 Cambio importante Contexto
Problema: Las bases de código que fueron escritas contra Código de barras de red antes de la v1.8 pueden tener llamadas a GetImage() que almacenaban el resultado sin tipificación explícita, confiando en el tipo de retorno interno previo a la v1.8. Es posible que estas llamadas ya no funcionen después de una actualización de NetBarcode, independientemente de la migración a IronBarcode .
Solución: Utilice la migración de IronBarcode como una oportunidad para resolver cualquier ruptura previa a la v1.8 al mismo tiempo. Todas las ubicaciones de llamadas a GetImage() deben ser localizadas con una búsqueda en todo el proyecto y reemplazadas por el método de salida de IronBarcode adecuado durante el proceso de migración. Los comandos grep que aparecen en la lista de verificación de migración a continuación identifican estas ubicaciones.
Lista de verificación para la migración de NetBarcode
Pre-Migración
Realice una auditoría de todo el uso de Código de barras de red antes de realizar cualquier cambio:
grep -r "using NetBarcode" ./src
grep -r "new Barcode(" ./src
grep -r "Type\.Code128\|Type\.EAN13\|Type\.Code39\|Type\.EAN8" ./src
grep -r "Type\.Codabar\|Type\.Code93" ./src
grep -r "SaveImageFile(" ./src
grep -r "GetImage(" ./src
grep -r "using SixLabors\.ImageSharp" ./src
grep -r "Image<Rgba32>" ./src
grep -r "using NetBarcode" ./src
grep -r "new Barcode(" ./src
grep -r "Type\.Code128\|Type\.EAN13\|Type\.Code39\|Type\.EAN8" ./src
grep -r "Type\.Codabar\|Type\.Code93" ./src
grep -r "SaveImageFile(" ./src
grep -r "GetImage(" ./src
grep -r "using SixLabors\.ImageSharp" ./src
grep -r "Image<Rgba32>" ./src
- Identificar todos los archivos que requieren un cambio en la directiva using.
- Anote todas las ubicaciones de llamadas a
GetImage()y cómo se usa el objetoImage<Rgba32>devuelto en la lógica descendente - Compruebe si QRCoder o ZXing .NET están presentes y si se pueden eliminar en la misma pasada.
- Ejecute
dotnet list package --include-transitivepara documentar el estado actual de la dependencia de ImageSharp antes de la eliminación - Obtenga una clave de licencia de IronBarcode (hay disponible una clave de prueba gratuita sin necesidad de compra).
Actualización de código
- Ejecute
dotnet remove package NetBarcode - Ejecute
dotnet remove package SixLabors.ImageSharpsi no es usado por otros paquetes - Ejecute
dotnet add package IronBarcode - Agregue
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";al inicio de la aplicación - Reemplace
using NetBarcode;porusing IronBarCode;en cada archivo afectado - Eliminé
using SixLabors.ImageSharp;,using SixLabors.ImageSharp.PixelFormats;yusing SixLabors.Fonts;de todos los archivos - Traduzca cada llamada a
new Barcode(data, Type.X)aBarcodeWriter.CreateBarcode(data, BarcodeEncoding.X)usando la tabla de mapeo de API - Reemplace
SaveImageFile()conSaveAsPng()o el método específico de formato adecuado - Reemplace las llamadas a
GetImage()conToPngBinaryData(),SaveAsPng(), oSaveAsPng(stream)según sea apropiado - Si elimina QRCoder: reemplace las cadenas
QRCodeGenerator+PngByteQRCodeconBarcodeWriter.CreateBarcode(data, BarcodeEncoding.QRCode) - Si elimina ZXing.Net: reemplace la configuración del lector con
BarcodeReader.Read(path)
Pruebas posteriores a la migración
- Compila el proyecto y confirma que no haya errores de compilación.
- Ejecutar las pruebas unitarias existentes con la salida del código de barras generado.
- Verificar visualmente las imágenes de los códigos de barras para comprobar que la simbología sea correcta y el contenido legible.
- Verifique la salida del código QR si ese formato se agregó durante la migración.
- Comprobar la funcionalidad de lectura si se ha añadido el escaneo de códigos de barras
- Ejecute
dotnet list package --include-transitivepara confirmar que ImageSharp ya no está presente si se eliminó - Validar que la inicialización de la clave de licencia se ejecute antes de la primera operación de código de barras.
Principales ventajas de migrar a IronBarcode
Cobertura de formatos unificada: Después de la migración, los códigos QR, DataMatrix, PDF417, Aztec y todos los demás formatos 2D están disponibles a través de la misma llamada a la API utilizada para Code128 y EAN-13. No se necesita una segunda biblioteca cuando los requisitos de formato se expanden, y la constante BarcodeEncoding es la única que cambia entre tipos de formato.
Lectura integrada: BarcodeReader.Read() maneja archivos de imagen y documentos PDF con detección automática de formato. Los proyectos que antes requerían el uso de ZXing .NET para la lectura pueden eliminar esa dependencia y consolidarse en una única biblioteca de códigos de barras, lo que reduce la superficie de la API que los desarrolladores del proyecto deben aprender.
Sin obligación de ImageSharp: IronBarcode no tiene ninguna dependencia de SixLabors.ImageSharp. Después de la migración, la condición de licencia comercial dividida incrustada en las dependencias transitivas de Código de barras de red ya no se aplica al proyecto. Las revisiones de cumplimiento de licencias se simplifican porque las obligaciones de la biblioteca de códigos de barras se establecen directamente y no dependen del umbral de ingresos de una biblioteca de procesamiento de imágenes de terceros.
API pública estable: IronBarcode no expone tipos de terceros en su interfaz de API pública. El tipo de retorno GeneratedBarcode de BarcodeWriter.CreateBarcode es un tipo propio de IronBarcode, lo que significa que futuras actualizaciones en la renderización interna de IronBarcode no producirán cambios incompatibles en el código de llamada como lo hizo el cambio de tipo GetImage() de Código de barras de red v1.8.
Una sola dependencia que mantener: Reemplazar NetBarcode, QRCoder y ZXing .NET con IronBarcode reduce tres ciclos de actualización, tres conjuntos de notas de lanzamiento y tres posibles conflictos de versiones a uno solo. A medida que avanzan las versiones de .NET y se hacen necesarias las actualizaciones de dependencias, el trabajo de mantenimiento se simplifica al utilizar una sola biblioteca en lugar de tres.
Preguntas Frecuentes
¿Por qué debería migrar de NetBarcode a IronBarcode?
Entre las razones más comunes se incluyen la simplificación de licencias (eliminando la complejidad de SDK + clave de tiempo de ejecución), la eliminación de límites de rendimiento, la obtención de compatibilidad nativa con PDF, la mejora de la implementación de Docker/CI/CD y la reducción de la repetición de API en el código de producción.
¿Cómo puedo sustituir las llamadas a la API de NetBarcode por IronBarcode?
Sustituya la creación de instancias y la repetición de licencias por IronBarCode.License.LicenseKey = "key". Sustituya las llamadas al lector por BarcodeReader.Read(path) y las llamadas al escritor por BarcodeWriter.CreateBarcode(data, encoding). Los métodos estáticos no requieren gestión de instancias.
¿Cuánto cambia el código al migrar de NetBarcode a IronBarcode?
La mayoría de las migraciones se traducen en menos líneas de código. Se eliminan la repetición de licencias, los constructores de instancias y la configuración explícita de formatos. Las operaciones básicas de lectura/escritura se traducen a equivalentes IronBarcode más cortos con objetos de resultado más limpios.
¿Necesito tener instalados NetBarcode e IronBarcode durante la migración?
No. La mayoría de las migraciones son sustituciones directas en lugar de operaciones paralelas. Migre una clase de servicio cada vez, sustituya la referencia NuGet y actualice los patrones de instanciación y llamada a la API antes de pasar a la siguiente clase.
¿Cuál es el nombre del paquete NuGet para IronBarcode?
El paquete es 'IronBarCode' (con B y C mayúsculas). Instálalo con 'Install-Package IronBarCode' o 'dotnet add package IronBarCode'. La directiva using en el código es 'using IronBarCode;'.
¿Cómo simplifica IronBarcode el despliegue de Docker en comparación con NetBarcode?
IronBarcode es un paquete NuGet sin archivos SDK externos ni configuración de licencia montada. En Docker, establezca la variable de entorno IRONBARCODE_LICENSE_KEY y el paquete se encargará de la validación de la licencia al inicio.
¿IronBarcode detecta automáticamente todos los formatos de código de barras tras migrar desde NetBarcode?
Sí, IronBarcode detecta automáticamente la simbología de todos los formatos compatibles. No es necesaria la enumeración explícita de BarcodeTypes. Si ya se conoce el formato y el rendimiento es importante, BarcodeReaderOptions permite restringir el espacio de búsqueda como optimización.
¿Puede IronBarcode leer códigos de barras de PDF sin una biblioteca independiente?
Sí. BarcodeReader.Read("document.pdf") procesa archivos PDF de forma nativa. Los resultados incluyen PageNumber, Format, Value y Confidence para cada código de barras encontrado. No es necesario ningún paso externo de procesamiento de PDF.
¿Cómo gestiona IronBarcode el procesamiento paralelo de códigos de barras?
Los métodos estáticos de IronBarcode no tienen estado y son seguros para los hilos. Utilice Parallel.ForEach directamente sobre listas de archivos sin gestión de instancias por subproceso. BarcodeReaderOptions.MaxParallelThreads controla el presupuesto interno de hilos.
¿Qué propiedades de los resultados cambian al migrar de NetBarcode a IronBarcode?
Cambios de nombre comunes: BarcodeValue se convierte en Value, BarcodeType se convierte en Format. Los resultados de IronBarcode también añaden Confidence y PageNumber. Una búsqueda y sustitución en toda la solución gestiona los cambios de nombre en el código de procesamiento de resultados existente.
¿Cómo configuro las licencias de IronBarcode en un proceso CI/CD?
Almacene IRONBARCODE_LICENSE_KEY como un secreto de canalización y asigne IronBarCode.License.LicenseKey en el código de inicio de la aplicación. Un secreto cubre todos los entornos, incluidos los de desarrollo, prueba, montaje y producción.
¿Admite IronBarcode la generación de códigos QR con estilos personalizados?
Sí. QRCodeWriter.CreateQrCode() admite colores personalizados mediante ChangeBarCodeColor(), incrustación de logotipos mediante AddBrandLogo(), niveles de corrección de errores configurables y múltiples formatos de salida, incluidos PNG, JPG, PDF y stream.

