Ir para o conteúdo do rodapé
COMPARAR COM OUTROS COMPONENTES
Uma comparação entre as bibliotecas IronBarcode e ZXing.NET

Uma comparação entre IronBarcode e ZXing.NET

Um scanner de código de barras pode não ser sempre apropriado para nossas aplicações. Você pode já ter uma imagem digital do código de barras e querer saber o que ele representa em texto em inglês. Além disso, este scanner só lê códigos de barras 1-D, que contêm uma quantidade limitada de dados e só podem ser usados na biblioteca de classes do Windows RT. Códigos de barras 2-D (também conhecidos como códigos QR) são agora comuns e podem conter muito mais informações.

Uma aplicação baseada em C# pode ser criada para ler códigos de barras usando chamadas de API simples e alguns passos de codificação. Uma aplicação suportada pelo .NET executa em Windows, macOS ou Linux sem depender de qualquer ferramenta ou API de terceiros.

Este artigo comparará as duas bibliotecas de aplicativos .NET Core mais poderosas para leitura de códigos de barras de forma programática. Essas duas bibliotecas são IronBarcode e ZXing.NET. Veremos o que torna o IronBarcode mais poderoso e robusto do que o ZXing.NET.


O que é o ZXing.NET

ZXing.NET é uma biblioteca que decodifica e gera códigos de barras (como QR Code, PDF 417, EAN, UPC, Aztec, Data Matrix, Codabar). ZXing, que significa "zebra crossing", é uma biblioteca de código aberto baseada em Java que suporta uma variedade de formatos de código de barras 1D e 2D.

Seus características essenciais são as seguintes:

  • Tem a capacidade de armazenar URLs, detalhes de contato, eventos de calendário e mais
  • É adaptado para aplicações Java SE
  • Permite a integração de scanner de códigos de barras via intent
  • É um app direto para Google Glass

O que é o IronBarcode

IronBarcode é uma biblioteca C# que permite que programadores leiam e gerem códigos de barras. Como uma biblioteca de códigos de barras líder, o IronBarcode suporta uma ampla variedade de códigos de barras de 1 dimensão e 2 dimensões, incluindo códigos QR decorados (coloridos e marcados). Suporta .NET Standard e Core Versões 2 e superiores, permitindo que seja usado de forma multiplataforma no Azure, Linux, macOS, Windows e Web. IronBarcode é uma biblioteca de classe ou componente bem conhecida para o sistema .NET que permite que desenvolvedores C#, VB.NET e F# trabalhem com linguagens de programação padronizadas. Permite que os clientes naveguem em etiquetas de scanner e criem novas etiquetas padronizadas. Funciona excepcionalmente bem com códigos de barras 2D e outros códigos de barras tridimensionais padronizados.

IronBarcode agora suporta códigos de barras 2D. Ele fornece funcionalidade para otimizar a coloração, estilo e pixelização desses códigos e a capacidade de adicionar logotipos a eles para uso em material impresso ou publicitário. Esta biblioteca também pode ler códigos de barras distorcidos e deformados, algo que outro software de códigos de barras pode não conseguir ler.

Instalando IronBarcode e ZXing.NET

Instalação do ZXing.NET

Para usar a biblioteca ZXing.NET, instale os seguintes dois pacotes em seu aplicativo ASP.NET Core usando o Gerenciador de Pacotes NuGet:

1. ZXing.Net

Install-Package ZXing.Net

2. ZXing.Net.Bindings.CoreCompat.System.Drawing

Install-Package ZXing.Net.Bindings.CoreCompat.System.Drawing -Version 0.16.5-beta

Alternativamente, instale ZXing.NET no seu projeto usando o Gerenciador de Pacotes NuGet. Para fazer isso, vá para Ferramentas > Gerenciador de Pacotes NuGet > Gerenciar pacotes NuGet para soluções..., depois mude para a aba 'Procurar' e procure por 'ZXing.NET'.

A Comparison between IronBarcode and Zxing.NET, Figure 1: Aplicação Web ASP.NET

Aplicação Web ASP.NET

Instalação do IronBarcode

Instale o IronBarcode usando o Gerenciador de Pacotes NuGet ou fazendo o download do DLL diretamente do site do produto. O namespace IronBarcode contém todas as classes do IronBarcode.

IronBarcode pode ser instalado usando o Gerenciador de Pacotes NuGet para Visual Studio: o nome do pacote é 'Barcode'.

Install-Package BarCode

Criando Código de Barras 2D

Usando ZXing.NET

Primeiro, crie uma nova pasta chamada 'qrr' dentro da pasta raiz do arquivo do projeto.

Em seguida, procederemos para criar arquivos QR e armazenar os arquivos do sistema de imagem dentro da pasta 'qrr'.

Dentro do Controller, adicione o método GenerateFile() conforme mostrado abaixo no código fonte.

public ActionResult GenerateFile()
{
    return View();
}

[HttpPost]
public ActionResult GenerateFile(string qrText)
{
    Byte [] byteArray;
    var width = 250; // width of the QR Code
    var height = 250; // height of the QR Code
    var margin = 0;

    // BarcodeWriterPixelData acts as a QR code generator
    var qrCodeWriter = new ZXing.BarcodeWriterPixelData
    {
        Format = ZXing.BarcodeFormat.QR_CODE,
        Options = new QrCodeEncodingOptions
        {
            Height = height,
            Width = width,
            Margin = margin
        }
    };
    var pixelData = qrCodeWriter.Write(qrText);

    // creating a PNG bitmap from the raw pixel data; if only black and white colors are used it makes no difference if the raw pixel data is BGRA oriented and the bitmap is initialized with RGB
    using (var bitmap = new System.Drawing.Bitmap(pixelData.Width, pixelData.Height, System.Drawing.Imaging.PixelFormat.Format32bppRgb))
    {
        using (var ms = new MemoryStream())
        {
            var bitmapData = bitmap.LockBits(new System.Drawing.Rectangle(0, 0, pixelData.Width, pixelData.Height), System.Drawing.Imaging.ImageLockMode.WriteOnly, System.Drawing.Imaging.PixelFormat.Format32bppRgb);
            try
            {
                // we assume that the row stride of the bitmap is aligned to 4 byte multiplied by the width of the image
                System.Runtime.InteropServices.Marshal.Copy(pixelData.Pixels, 0, bitmapData.Scan0, pixelData.Pixels.Length);
            }
            finally
            {
                bitmap.UnlockBits(bitmapData);
           }

            // Save to folder
            string fileGuid = Guid.NewGuid().ToString().Substring(0, 4);
            bitmap.Save(Server.MapPath("~/qrr") + "/file-" + fileGuid + ".png", System.Drawing.Imaging.ImageFormat.Png);

            // Save to stream as PNG
            bitmap.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
            byteArray = ms.ToArray();
        }
    }
    return View(byteArray);
}
public ActionResult GenerateFile()
{
    return View();
}

[HttpPost]
public ActionResult GenerateFile(string qrText)
{
    Byte [] byteArray;
    var width = 250; // width of the QR Code
    var height = 250; // height of the QR Code
    var margin = 0;

    // BarcodeWriterPixelData acts as a QR code generator
    var qrCodeWriter = new ZXing.BarcodeWriterPixelData
    {
        Format = ZXing.BarcodeFormat.QR_CODE,
        Options = new QrCodeEncodingOptions
        {
            Height = height,
            Width = width,
            Margin = margin
        }
    };
    var pixelData = qrCodeWriter.Write(qrText);

    // creating a PNG bitmap from the raw pixel data; if only black and white colors are used it makes no difference if the raw pixel data is BGRA oriented and the bitmap is initialized with RGB
    using (var bitmap = new System.Drawing.Bitmap(pixelData.Width, pixelData.Height, System.Drawing.Imaging.PixelFormat.Format32bppRgb))
    {
        using (var ms = new MemoryStream())
        {
            var bitmapData = bitmap.LockBits(new System.Drawing.Rectangle(0, 0, pixelData.Width, pixelData.Height), System.Drawing.Imaging.ImageLockMode.WriteOnly, System.Drawing.Imaging.PixelFormat.Format32bppRgb);
            try
            {
                // we assume that the row stride of the bitmap is aligned to 4 byte multiplied by the width of the image
                System.Runtime.InteropServices.Marshal.Copy(pixelData.Pixels, 0, bitmapData.Scan0, pixelData.Pixels.Length);
            }
            finally
            {
                bitmap.UnlockBits(bitmapData);
           }

            // Save to folder
            string fileGuid = Guid.NewGuid().ToString().Substring(0, 4);
            bitmap.Save(Server.MapPath("~/qrr") + "/file-" + fileGuid + ".png", System.Drawing.Imaging.ImageFormat.Png);

            // Save to stream as PNG
            bitmap.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
            byteArray = ms.ToArray();
        }
    }
    return View(byteArray);
}
$vbLabelText   $csharpLabel

A única mudança restante é salvar o arquivo de código QR dentro da pasta 'qrr'. Isso é realizado utilizando as duas linhas de código abaixo.

string fileGuid = Guid.NewGuid().ToString().Substring(0, 4);
bitmap.Save(Server.MapPath("~/qrr") + "/file-" + fileGuid + ".png", System.Drawing.Imaging.ImageFormat.Png);
string fileGuid = Guid.NewGuid().ToString().Substring(0, 4);
bitmap.Save(Server.MapPath("~/qrr") + "/file-" + fileGuid + ".png", System.Drawing.Imaging.ImageFormat.Png);
$vbLabelText   $csharpLabel

Em seguida, você deve criar a visão GenerateFile e incluir o seguinte código nela. A visão GenerateFile é idêntica à visão Index.

@model Byte []
@using (Html.BeginForm(null, null, FormMethod.Post))
{
    <table>
        <tbody>
            <tr>
                <td>
                    <label>Enter text for creating QR Code</label>
                </td>
                <td>
                <input type="text" name="qrText" />
                </td>
            </tr>
            <tr>
                <td colspan="2">
                    <button>Submit</button>
                </td>
            </tr>
        </tbody>
    </table>
}
@{
    if (Model != null)
    {
        <h3>QR Code Successfully Generated</h3>
        <img src="@String.Format("data:image/png;base64,{0}", Convert.ToBase64String(Model))" />
    }
}
@model Byte []
@using (Html.BeginForm(null, null, FormMethod.Post))
{
    <table>
        <tbody>
            <tr>
                <td>
                    <label>Enter text for creating QR Code</label>
                </td>
                <td>
                <input type="text" name="qrText" />
                </td>
            </tr>
            <tr>
                <td colspan="2">
                    <button>Submit</button>
                </td>
            </tr>
        </tbody>
    </table>
}
@{
    if (Model != null)
    {
        <h3>QR Code Successfully Generated</h3>
        <img src="@String.Format("data:image/png;base64,{0}", Convert.ToBase64String(Model))" />
    }
}
$vbLabelText   $csharpLabel

Insira qualquer valor na caixa de texto e clique no botão 'Enviar'. O Código QR será gerado e salvo como um arquivo .PNG na pasta 'qrr'.

A Comparison between IronBarcode and ZXing.NET, Figure 2: Gerador de código QR

Gerador de código QR

A Comparison between IronBarcode and ZXing.NET, Figure 3: Arquivos de Código QR Exibidos

Arquivos de Código QR Exibidos

Formatos de Código de Barras Suportados

IronBarcode suporta uma ampla gama de formatos de códigos de barras comumente usados, incluindo:

  • Códigos QR com logotipos e cores (incluindo códigos decorados e com marca)
  • Códigos de barras de múltiplos formatos, incluindo Aztec, Data Matrix, CODE 93, CODE 128, RSS Expanded Databar, UPS MaxiCode, e USPS, IMB (barras únicas)
  • Códigos de barras lineares empilhados RSS-14 e PDF-417
  • UPCA, UPCE, EAN-8, EAN-13, Codabar, ITF, MSI, e Plessey são formatos tradicionais de códigos de barras numéricos.

Criar e Salvar Código de Barras

using IronBarCode;
// Create a barcode and save it in various formats
var MyBarCode = BarcodeWriter.CreateBarcode("https://ironsoftware.com/csharp/barcode", BarcodeEncoding.Code128);
MyBarCode.SaveAsImage("MyBarCode.png");
MyBarCode.SaveAsGif("MyBarCode.gif");
MyBarCode.SaveAsHtmlFile("MyBarCode.html");
MyBarCode.SaveAsJpeg("MyBarCode.jpg");
MyBarCode.SaveAsPdf("MyBarCode.Pdf");
MyBarCode.SaveAsPng("MyBarCode.png");
MyBarCode.SaveAsTiff("MyBarCode.tiff");
MyBarCode.SaveAsWindowsBitmap("MyBarCode.bmp");

// Convert barcode to different image formats and obtain binary data
System.Drawing.Image MyBarCodeImage = MyBarCode.Image;
System.Drawing.Bitmap MyBarCodeBitmap = MyBarCode.ToBitmap();
string DataURL = MyBarCode.ToDataUrl();
string ImgTagForHTML = MyBarCode.ToHtmlTag();
byte[] PngBytes = MyBarCode.ToPngBinaryData();

// Save barcode in PDF stream
using (System.IO.Stream PdfStream = MyBarCode.ToPdfStream())
{
    // The Stream barcode image output also works for GIF, JPEG, PDF, PNG, BMP and TIFF
}

// Stamp barcode onto an existing PDF at a specific position
MyBarCode.StampToExistingPdfPage("ExistingPDF.pdf", 1, 200, 50);
using IronBarCode;
// Create a barcode and save it in various formats
var MyBarCode = BarcodeWriter.CreateBarcode("https://ironsoftware.com/csharp/barcode", BarcodeEncoding.Code128);
MyBarCode.SaveAsImage("MyBarCode.png");
MyBarCode.SaveAsGif("MyBarCode.gif");
MyBarCode.SaveAsHtmlFile("MyBarCode.html");
MyBarCode.SaveAsJpeg("MyBarCode.jpg");
MyBarCode.SaveAsPdf("MyBarCode.Pdf");
MyBarCode.SaveAsPng("MyBarCode.png");
MyBarCode.SaveAsTiff("MyBarCode.tiff");
MyBarCode.SaveAsWindowsBitmap("MyBarCode.bmp");

// Convert barcode to different image formats and obtain binary data
System.Drawing.Image MyBarCodeImage = MyBarCode.Image;
System.Drawing.Bitmap MyBarCodeBitmap = MyBarCode.ToBitmap();
string DataURL = MyBarCode.ToDataUrl();
string ImgTagForHTML = MyBarCode.ToHtmlTag();
byte[] PngBytes = MyBarCode.ToPngBinaryData();

// Save barcode in PDF stream
using (System.IO.Stream PdfStream = MyBarCode.ToPdfStream())
{
    // The Stream barcode image output also works for GIF, JPEG, PDF, PNG, BMP and TIFF
}

// Stamp barcode onto an existing PDF at a specific position
MyBarCode.StampToExistingPdfPage("ExistingPDF.pdf", 1, 200, 50);
$vbLabelText   $csharpLabel

Por outro lado, ZXing é uma biblioteca de processamento de imagens de código de barras 1D/2D de código aberto baseada em Java. UPC-A, UPC-E, EAN-8, Code 93, Code 128, Código QR, Data Matrix, Aztec, PDF 417, e outros formatos de código de barras são suportados.

A Comparison between IronBarcode and Zxing.NET, Figure 4: Formatos de código de barras suportados

Formatos de código de barras suportados

Criar arquivos de Código QR usando IronBarcode

Para criar códigos QR com IronBarcode, podemos usar a classe QRCodeWriter ao invés da classe BarcodeWriter. Esta classe introduz alguns recursos novos e intrigantes para criar códigos QR. Ela nos permite definir o nível de correção de erros do QR, permitindo que você encontre um equilíbrio entre o tamanho e a legibilidade do seu código QR.

using IronBarCode;
// Generate a simple QR Code image and save as PNG
QRCodeWriter.CreateQrCode("hello world", 500, QRCodeWriter.QrErrorCorrectionLevel.Medium).SaveAsPng("MyQR.png");
using IronBarCode;
// Generate a simple QR Code image and save as PNG
QRCodeWriter.CreateQrCode("hello world", 500, QRCodeWriter.QrErrorCorrectionLevel.Medium).SaveAsPng("MyQR.png");
$vbLabelText   $csharpLabel

A correção de erros nos permite especificar quão fácil será ler um código QR em situações reais. Níveis mais altos de correção de erros resultam em códigos QR maiores com mais pixels e complexidade. Na imagem abaixo, vemos o arquivo do código QR exibido.

A Comparison between IronBarcode and ZXing.NET, Figure 5: Formatos de código de barras suportados

Imagem de Código QR

Começamos especificando o valor do código de barras e o formato do código de barras do enum IronBarCode.BarcodeWriterEncoding. Podemos então salvar como uma imagem, um System.Drawing.Image, ou um objeto de código Bitmap.

using IronBarCode;
using System.Diagnostics;

// Generate a simple BarCode image and save as PNG using the following namespaces
GeneratedBarcode MyBarCode = IronBarCode.BarcodeWriter.CreateBarcode("https://ironsoftware.com/csharp/barcode", BarcodeWriterEncoding.Code128);
MyBarCode.SaveAsPng("MyBarCode.png");

// This line opens the image in your default image viewer
Process.Start("MyBarCode.png");
using IronBarCode;
using System.Diagnostics;

// Generate a simple BarCode image and save as PNG using the following namespaces
GeneratedBarcode MyBarCode = IronBarCode.BarcodeWriter.CreateBarcode("https://ironsoftware.com/csharp/barcode", BarcodeWriterEncoding.Code128);
MyBarCode.SaveAsPng("MyBarCode.png");

// This line opens the image in your default image viewer
Process.Start("MyBarCode.png");
$vbLabelText   $csharpLabel
A Comparison between IronBarcode and ZXing.NET, Figure 6: Criar Imagem de Código de Barras em Exemplo C#

Criar Imagem de Código de Barras em Exemplo C#

IronBarcode também suporta estilizar códigos QR, como ter um gráfico de logotipo colocado e ajustado a uma grade no centro exato da imagem. Ele também pode ser colorido para corresponder a uma marca ou identidade gráfica específica.

Para testar, crie um logotipo no exemplo de código abaixo e veja como é simples usar o método QRCodeWriter.CreateQRCodeWithLogo.

using IronBarCode;

// Adding a Logo
var MyQRWithLogo = QRCodeWriter.CreateQrCodeWithLogo("https://ironsoftware.com/csharp/barcode/", "visual-studio-logo.png", 500);
MyQRWithLogo.ChangeBarCodeColor(System.Drawing.Color.DarkGreen);
using IronBarCode;

// Adding a Logo
var MyQRWithLogo = QRCodeWriter.CreateQrCodeWithLogo("https://ironsoftware.com/csharp/barcode/", "visual-studio-logo.png", 500);
MyQRWithLogo.ChangeBarCodeColor(System.Drawing.Color.DarkGreen);
$vbLabelText   $csharpLabel
A Comparison between IronBarcode and ZXing.NET, Figure 7: Criar Código QR Com Imagem de Logotipo

Criar Código QR Com Imagem de Logotipo

Finalmente, salvamos o código QR gerado como um arquivo PDF. Para sua conveniência, a última linha do código salva o código QR como um arquivo HTML.

using IronBarCode;

// Adding a Logo
var MyQRWithLogo = QRCodeWriter.CreateQrCodeWithLogo("https://ironsoftware.com/csharp/barcode/", "visual-studio-logo.png", 500);
MyQRWithLogo.ChangeBarCodeColor(System.Drawing.Color.DarkGreen);

// Save as PDF
MyQRWithLogo.SaveAsPdf("MyQRWithLogo.pdf");

// Also Save as HTML
MyQRWithLogo.SaveAsHtmlFile("MyQRWithLogo.html");
using IronBarCode;

// Adding a Logo
var MyQRWithLogo = QRCodeWriter.CreateQrCodeWithLogo("https://ironsoftware.com/csharp/barcode/", "visual-studio-logo.png", 500);
MyQRWithLogo.ChangeBarCodeColor(System.Drawing.Color.DarkGreen);

// Save as PDF
MyQRWithLogo.SaveAsPdf("MyQRWithLogo.pdf");

// Also Save as HTML
MyQRWithLogo.SaveAsHtmlFile("MyQRWithLogo.html");
$vbLabelText   $csharpLabel

Abaixo, vemos como criar, estilizar e exportar um código de barras com apenas uma linha de código.

IronBarcode inclui uma API fluente que é semelhante a System.Linq. Criamos um código de barras, definimos suas margens e exportamos para bitmap em uma única linha, encadeando chamadas de método. Isso pode ser muito útil e torna o código mais fácil de ler.

using IronBarCode;
using System.Drawing;

// Fluent API for Barcode image generation
string MyValue = "https://ironsoftware.com/csharp/barcode";
Bitmap BarcodeBmp = IronBarCode.BarcodeWriter.CreateBarcode(MyValue, BarcodeEncoding.PDF417)
    .ResizeTo(300, 200)
    .SetMargins(100)
    .ToBitmap();
using IronBarCode;
using System.Drawing;

// Fluent API for Barcode image generation
string MyValue = "https://ironsoftware.com/csharp/barcode";
Bitmap BarcodeBmp = IronBarCode.BarcodeWriter.CreateBarcode(MyValue, BarcodeEncoding.PDF417)
    .ResizeTo(300, 200)
    .SetMargins(100)
    .ToBitmap();
$vbLabelText   $csharpLabel

Como resultado, um System.Drawing.Image de um código de barras PDF417 aparece conforme mostrado abaixo:

A Comparison between IronBarcode and ZXing.NET, Figure 8: Geração de código de barras PDF417 simples e fluente em C#

Geração de código de barras PDF417 simples e fluente em C#

Lendo arquivos de QR Code

Lendo QR Codes com IronBarcode

Ler um código de barras ou QR code é fácil quando você usa a biblioteca de classes IronBarcode em conjunto com o leitor de código de barras .NET. No nosso primeiro exemplo, podemos ver como ler um código de barras usando apenas uma linha de código.

A Comparison between IronBarcode and ZXing.NET, Figure 9: Imagem de código de barras Code128 a ser escaneada com C#

Imagem de código de barras Code128 a ser escaneada com C#

Podemos obter o valor do código de barras, imagem, tipo de codificação e dados binários (se houver) e então exibi-los no console.

using IronBarCode;
using System;

// Read a barcode or QR code from an image
BarcodeResult Result = BarcodeReader.QuicklyReadOneBarcode("GetStarted.png");
if (Result != null && Result.Text == "https://ironsoftware.com/csharp/barcode/")
{
    Console.WriteLine("GetStarted was a success.  Read Value: " + Result.Text);
}
using IronBarCode;
using System;

// Read a barcode or QR code from an image
BarcodeResult Result = BarcodeReader.QuicklyReadOneBarcode("GetStarted.png");
if (Result != null && Result.Text == "https://ironsoftware.com/csharp/barcode/")
{
    Console.WriteLine("GetStarted was a success.  Read Value: " + Result.Text);
}
$vbLabelText   $csharpLabel

Lendo códigos de barras dentro de PDFs

Veremos como ler um documento PDF escaneado e encontrar todos os códigos de barras unidimensionais em poucas linhas de código.

Como você pode ver, é muito semelhante a ler um único código de barras de um único documento, exceto que agora sabemos em qual número de página o código de barras foi descoberto.

using IronBarCode;
using System;
using System.Drawing;

// Multiple barcodes may be scanned up from a single document or image. A PDF document may also be used as the input image
PagedBarcodeResult[] PDFResults = BarcodeReader.ReadBarcodesFromPdf("MultipleBarcodes.pdf");

// Work with the results
foreach (var PageResult in PDFResults)
{
    string Value = PageResult.Value;
    int PageNum = PageResult.PageNumber;
    System.Drawing.Bitmap Img = PageResult.BarcodeImage;
    BarcodeEncoding BarcodeType = PageResult.BarcodeType;
    byte[] Binary = PageResult.BinaryValue;
    Console.WriteLine(PageResult.Value + " on page " + PageNum);
}
using IronBarCode;
using System;
using System.Drawing;

// Multiple barcodes may be scanned up from a single document or image. A PDF document may also be used as the input image
PagedBarcodeResult[] PDFResults = BarcodeReader.ReadBarcodesFromPdf("MultipleBarcodes.pdf");

// Work with the results
foreach (var PageResult in PDFResults)
{
    string Value = PageResult.Value;
    int PageNum = PageResult.PageNumber;
    System.Drawing.Bitmap Img = PageResult.BarcodeImage;
    BarcodeEncoding BarcodeType = PageResult.BarcodeType;
    byte[] Binary = PageResult.BinaryValue;
    Console.WriteLine(PageResult.Value + " on page " + PageNum);
}
$vbLabelText   $csharpLabel

Você obterá dados de resultado com todos os códigos de barras bitmap no PDF.

A Comparison between IronBarcode and ZXing.NET, Figure 10: Lendo códigos de barras armazenados dentro dos resultados do PDF

Lendo códigos de barras armazenados dentro dos resultados do PDF

Lendo códigos de barras de GIF e TIFF

using IronBarCode;
using System;

// Multi-frame TIFF and GIF images can also be scanned, and multiple threads will be used automatically in the background for improved performance
PagedBarcodeResult[] MultiFrameResults = BarcodeReader.ReadBarcodesFromMultiFrameTiff("Multiframe.tiff", BarcodeEncoding.Code128, BarcodeReader.BarcodeRotationCorrection.High, BarcodeReader.BarcodeImageCorrection.MediumCleanPixels);
foreach (var PageResult in MultiFrameResults)
{
    // Process each page result
}
using IronBarCode;
using System;

// Multi-frame TIFF and GIF images can also be scanned, and multiple threads will be used automatically in the background for improved performance
PagedBarcodeResult[] MultiFrameResults = BarcodeReader.ReadBarcodesFromMultiFrameTiff("Multiframe.tiff", BarcodeEncoding.Code128, BarcodeReader.BarcodeRotationCorrection.High, BarcodeReader.BarcodeImageCorrection.MediumCleanPixels);
foreach (var PageResult in MultiFrameResults)
{
    // Process each page result
}
$vbLabelText   $csharpLabel
A Comparison between IronBarcode and ZXing.NET, Figure 11: Lendo Códigos de Barras de uma Imagem TIFF Multi-frame

Lendo Códigos de Barras de uma Imagem TIFF Multi-frame

O exemplo a seguir mostra como ler QR codes e códigos de barras PDF-417 de um PDF escaneado. Definimos um nível apropriado de correção de rotação de código de barras e correção de imagem de código de barras para limpar levemente o documento sem incorrer em uma penalidade de desempenho significativa.

using IronBarCode;
using System;

// PDF documents can also be scanned, and multiple threads will be used automatically in the background for improved performance
var ScanResults = BarcodeReader.ReadBarcodesFromPdf("Scan.pdf", BarcodeEncoding.All, BarcodeReader.BarcodeRotationCorrection.Low, BarcodeReader.BarcodeImageCorrection.LightlyCleanPixels);

// Work with the results
foreach (var PageResult in ScanResults)
{
    string Value = PageResult.Value;
    //...
}
using IronBarCode;
using System;

// PDF documents can also be scanned, and multiple threads will be used automatically in the background for improved performance
var ScanResults = BarcodeReader.ReadBarcodesFromPdf("Scan.pdf", BarcodeEncoding.All, BarcodeReader.BarcodeRotationCorrection.Low, BarcodeReader.BarcodeImageCorrection.LightlyCleanPixels);

// Work with the results
foreach (var PageResult in ScanResults)
{
    string Value = PageResult.Value;
    //...
}
$vbLabelText   $csharpLabel
A Comparison between IronBarcode and ZXing.NET, Figure 12: Lendo códigos de barras de um documento PDF escaneado

Lendo códigos de barras de um documento PDF escaneado

Lendo QR Codes CORROMPIDOS de imagens bitmap

O exemplo abaixo mostra que esta biblioteca de código de barras C# pode até ler uma miniatura de código de barras corrompida.

A correção do tamanho da miniatura do código de barras é feita automaticamente. IronBarcode em C# torna um arquivo legível.

Os métodos do leitor detectam automaticamente imagens de códigos de barras que são muito pequenas para serem códigos de barras legítimos e as amplificam. Eles limpam todo o ruído digital associado ao trabalho com miniaturas, tornando-as legíveis novamente.

using IronBarCode;

// Small or 'Thumbnail' barcode images are automatically detected by IronBarcode and corrected wherever possible even if they have much digital noise.
BarcodeResult SmallResult = BarcodeReader.QuicklyReadOneBarcode("ThumbnailOfBarcode.gif", BarcodeEncoding.Code128);
using IronBarCode;

// Small or 'Thumbnail' barcode images are automatically detected by IronBarcode and corrected wherever possible even if they have much digital noise.
BarcodeResult SmallResult = BarcodeReader.QuicklyReadOneBarcode("ThumbnailOfBarcode.gif", BarcodeEncoding.Code128);
$vbLabelText   $csharpLabel
A Comparison between IronBarcode and ZXing.NET, Figure 13: Correção automática do tamanho da miniatura do código de barras

Correção automática do tamanho da miniatura do código de barras

Lendo códigos de barras de imagens imperfeitas

Em cenários do mundo real, podemos querer ler códigos de barras de imagens imperfeitas. Elas podem ser imagens inclinadas ou fotografias com ruído digital. Isso seria impossível com a maioria das bibliotecas de geração e leitura de código de barras .NET de código aberto. Por outro lado, o IronBarcode torna a leitura de códigos de barras de imagens imperfeitas uma tarefa fácil.

Agora vamos olhar para o método ReadASingleBarcode. Com seu parâmetro RotationCorrection, IronBarcode tenta corrigir a inclinação e ler códigos de barras a partir de amostras digitais imperfeitas.

using IronBarCode;
using System;
using System.Drawing;

// All BarcodeResult.Read methods provide the developer with control to correct image and photograph correction and straightening rotation and perspective from skewed images
// * RotationCorrection   e.g BarcodeReader.BarcodeRotationCorrection.Extreme un-rotates and removes perspective from barcode images.
// * ImageCorrection      e.g BarcodeReader.BarcodeImageCorrection.DeepCleanPixels separates barcodes from background imagery and digital noise.
// * BarcodeEncoding      e.g. BarcodeEncoding.Code128,  Setting a specific Barcode format improves speed and reduces the risk of false positive results

// Example with a photo image
var PhotoResult = BarcodeReader.ReadASingleBarcode("Photo.png", BarcodeEncoding.Code128, BarcodeReader.BarcodeRotationCorrection.Medium, BarcodeReader.BarcodeImageCorrection.DeepCleanPixels);
string Value = PhotoResult.Value;
System.Drawing.Bitmap Img = PhotoResult.BarcodeImage;
BarcodeEncoding BarcodeType = PhotoResult.BarcodeType;
byte[] Binary = PhotoResult.BinaryValue;
Console.WriteLine(PhotoResult.Value);
using IronBarCode;
using System;
using System.Drawing;

// All BarcodeResult.Read methods provide the developer with control to correct image and photograph correction and straightening rotation and perspective from skewed images
// * RotationCorrection   e.g BarcodeReader.BarcodeRotationCorrection.Extreme un-rotates and removes perspective from barcode images.
// * ImageCorrection      e.g BarcodeReader.BarcodeImageCorrection.DeepCleanPixels separates barcodes from background imagery and digital noise.
// * BarcodeEncoding      e.g. BarcodeEncoding.Code128,  Setting a specific Barcode format improves speed and reduces the risk of false positive results

// Example with a photo image
var PhotoResult = BarcodeReader.ReadASingleBarcode("Photo.png", BarcodeEncoding.Code128, BarcodeReader.BarcodeRotationCorrection.Medium, BarcodeReader.BarcodeImageCorrection.DeepCleanPixels);
string Value = PhotoResult.Value;
System.Drawing.Bitmap Img = PhotoResult.BarcodeImage;
BarcodeEncoding BarcodeType = PhotoResult.BarcodeType;
byte[] Binary = PhotoResult.BinaryValue;
Console.WriteLine(PhotoResult.Value);
$vbLabelText   $csharpLabel
A Comparison between IronBarcode and ZXing.NET, Figure 14: Lendo um código de barras de uma câmera de telefone

Lendo um código de barras de uma câmera de telefone

O IronBarcode também pode ler vários códigos de barras ao mesmo tempo. Obtemos melhores resultados do IronBarcode quando criamos uma lista de documentos e usamos o leitor de código de barras para ler numerosos documentos. O método ReadBarcodesMultithreaded para o processo de escaneamento de código de barras usa múltiplos threads e potencialmente todos os núcleos de seu CPU, o que pode ser exponencialmente mais rápido do que ler códigos de barras um de cada vez.

using IronBarCode;

// The BarcodeResult.ReadBarcodesMultiThreaded method allows for faster barcode scanning of multiple images or PDFs. All threads are automatically managed by IronBarcode.
var ListOfDocuments = new[] { "Image1.png", "image2.JPG", "image3.pdf" };
PagedBarcodeResult[] BatchResults = BarcodeReader.ReadBarcodesMultiThreaded(ListOfDocuments);

// Work with the results
foreach (var Result in BatchResults)
{
    string Value = Result.Value;
    //...
}
using IronBarCode;

// The BarcodeResult.ReadBarcodesMultiThreaded method allows for faster barcode scanning of multiple images or PDFs. All threads are automatically managed by IronBarcode.
var ListOfDocuments = new[] { "Image1.png", "image2.JPG", "image3.pdf" };
PagedBarcodeResult[] BatchResults = BarcodeReader.ReadBarcodesMultiThreaded(ListOfDocuments);

// Work with the results
foreach (var Result in BatchResults)
{
    string Value = Result.Value;
    //...
}
$vbLabelText   $csharpLabel

Lendo e Decodificando QR Codes com ZXing.NET

Para ler os arquivos de código QR, adicione um método de ação ViewFile ao seu controlador, conforme mostrado abaixo.

public ActionResult ViewFile()
{
    List<KeyValuePair<string, string>> fileData = new List<KeyValuePair<string, string>>();
    KeyValuePair<string, string> data;

    string[] files = Directory.GetFiles(Server.MapPath("~/qrr"));
    foreach (string file in files)
    {
        // Create a barcode reader instance
        IBarcodeReader reader = new BarcodeReader();

        // Load a bitmap
        var barcodeBitmap = (Bitmap)Image.FromFile(Server.MapPath("~/qrr") + "/" + Path.GetFileName(file));

        // Detect and decode the barcode inside the bitmap
        var result = reader.Decode(barcodeBitmap);

        // Do something with the result
        data = new KeyValuePair<string, string>(result.ToString(), "/QR/" + Path.GetFileName(file));
        fileData.Add(data);
    }
    return View(fileData);
}
public ActionResult ViewFile()
{
    List<KeyValuePair<string, string>> fileData = new List<KeyValuePair<string, string>>();
    KeyValuePair<string, string> data;

    string[] files = Directory.GetFiles(Server.MapPath("~/qrr"));
    foreach (string file in files)
    {
        // Create a barcode reader instance
        IBarcodeReader reader = new BarcodeReader();

        // Load a bitmap
        var barcodeBitmap = (Bitmap)Image.FromFile(Server.MapPath("~/qrr") + "/" + Path.GetFileName(file));

        // Detect and decode the barcode inside the bitmap
        var result = reader.Decode(barcodeBitmap);

        // Do something with the result
        data = new KeyValuePair<string, string>(result.ToString(), "/QR/" + Path.GetFileName(file));
        fileData.Add(data);
    }
    return View(fileData);
}
$vbLabelText   $csharpLabel
A Comparison between IronBarcode and ZXing.NET, Figure 15: Lendo e Decodificando QR Code

Lendo e Decodificando QR Code

A Comparison between IronBarcode and ZXing.NET, Figure 16: QR Code Decodificado

QR Code Decodificado

Decodificando um código de barras dentro de um bitmap

using ZXing;
using System.Drawing;

// Create a barcode reader instance
BarcodeReader reader = new BarcodeReader();

// Load a bitmap
var barcodeBitmap = (Bitmap)Image.FromFile("C:\\sample-barcode-image.png");

// Detect and decode the barcode inside the bitmap
var result = reader.Decode(barcodeBitmap);

// Do something with the result
if (result != null)
{
    txtDecoderType.Text = result.BarcodeFormat.ToString();
    txtDecoderContent.Text = result.Text;
}
using ZXing;
using System.Drawing;

// Create a barcode reader instance
BarcodeReader reader = new BarcodeReader();

// Load a bitmap
var barcodeBitmap = (Bitmap)Image.FromFile("C:\\sample-barcode-image.png");

// Detect and decode the barcode inside the bitmap
var result = reader.Decode(barcodeBitmap);

// Do something with the result
if (result != null)
{
    txtDecoderType.Text = result.BarcodeFormat.ToString();
    txtDecoderContent.Text = result.Text;
}
$vbLabelText   $csharpLabel

Decodificador ZXing Online

O ZXing Decoder Online é um scanner de códigos de barras e QR codes disponível online que suporta decodificação. Envie uma imagem de QR code em formato PNG ou outro, e ele começará a decodificação. Da mesma forma, você pode gerar um QR code para qualquer dado. Na maioria das vezes, essa informação será uma URL ou texto que você deseja codificar em um QR code.

Navegue até o site do ZXing Decoder.

A Comparison between IronBarcode and ZXing.NET, Figure 17: QR Code Decodificado

Site do ZXing Decoder

A Comparison between IronBarcode and ZXing.NET, Figure 18: QR Code Decodificado

Resultado do Decodificador ZXing

Preços e licenciamento

A biblioteca ZXing.NET é uma biblioteca gratuita e de código aberto que permite construir aplicativos de leitura de códigos de barras, licenciada sob a Licença Apache 2.0, que permite o uso comercial gratuito com a devida atribuição.

Uma licença de desenvolvedor para IronBarcode é oferecida gratuitamente. IronBarcode tem um esquema de preços único: o pacote Lite começa em $liteLicense sem custos adicionais. Itens SaaS e OEM também podem ser redistribuídos novamente. Cada licença inclui uma licença perpétua, validade para desenvolvimento/homologação/produção, garantia de devolução do dinheiro em 30 dias e um ano de suporte e atualizações de software (compra única). Visite esta página para ver a informação completa de preços e licença da IronBarcode.

Por que escolher IronBarcode?

IronBarcode inclui uma API fácil de usar para os desenvolvedores lerem e escreverem códigos de barras no .NET, que otimiza a precisão e a baixa taxa de erro em casos de uso do mundo real.

A classe BarcodeWriter, por exemplo, irá validar e corrigir 'checksums' em códigos de barras UPCA e UPCE. Ela também 'completará com zeros' números muito curtos para serem inseridos em um formato numérico específico. Se seus dados forem incompatíveis com o formato de dados especificado, IronBarcode notificará o desenvolvedor de um formato de código de barras mais adequado que ele possa usar.

IronBarcode se destaca na leitura de códigos de barras quando o código foi escaneado ou lido de uma imagem fotográfica, ou seja, quando a imagem não é perfeita graficamente e não é uma captura de tela gerada por máquina.

Como é o IronBarcode diferente do ZXing.NET?

IronBarcode é construído a partir do núcleo do ZXing.NET (Zebra Crossing), com capacidade de processamento aprimorada. Ele vem com uma API fácil de usar e uma baixa taxa de erro em comparação com a biblioteca de núcleo do ZXing.NET. Não só isso, mas o IronBarcode também suporta uma gama mais ampla de formatos de códigos de barras do que a biblioteca usual do ZXing.NET suporta.

IronBarcode é uma versão mais aprimorada do ZXing.NET, oferecendo ao usuário a plataforma para uso comercial e a possibilidade de usar o mesmo pacote em várias plataformas. Ele também tem suporte técnico completo, sempre pronto para ajudá-lo onde for necessário.

IronBarcode inclui rotação automática, correção de perspectiva e correção de ruído digital e pode detectar o tipo de código de barras codificado em uma imagem.

Conclusão

Em conclusão, IronBarcode é uma biblioteca de software .NET versátil e um gerador de Código QR C# para ler uma ampla gama de formatos de códigos de barras, sejam eles capturas de tela, fotografias, scans ou outras imagens imperfeitas do mundo real.

IronBarcode é uma das bibliotecas mais eficazes para criar e identificar códigos de barras. Em termos de criação e identificação de códigos de barras, é também uma das bibliotecas mais rápidas. Diferentes sistemas operacionais são compatíveis com a biblioteca. É fácil de projetar e suporta uma ampla gama de formatos de códigos de barras. Além disso, vários símbolos, formatos e caracteres são suportados.

O código de barras ZXing.NET é uma poderosa biblioteca que gera e reconhece códigos de barras em vários formatos de imagem. Podemos ler e criar imagens em uma variedade de formatos. ZXing.NET também permite que você altere a aparência de um código de barras, alterando sua altura, largura, texto do código de barras, e assim por diante.

Em comparação com o ZXing.NET, os pacotes IronBarcode oferecem licenciamento e suporte confiáveis. IronBarcode custa $liteLicense. Embora o ZXing seja gratuito e de código aberto, IronBarcode fornece suporte comercial abrangente e manutenção profissional. Além de ser mais flexível do que o ZXing.NET, a solução Iron Barcode também possui mais funcionalidades. Assim, é evidente que o IronBarcode tem uma forte vantagem sobre o ZXing.NET.

Ao comparar os tempos de processamento para reconhecer e gerar códigos de barras, IronBarcode supera o ZXing.NET. IronBarcode também possui várias propriedades que nos permitem ler códigos de barras de diferentes formatos de imagem e documentos PDF. Ele também permite incluir imagens dentro do código de barras ou código QR, o que não está disponível em nenhuma outra biblioteca.

IronBarcode é gratuito para os primeiros estágios de desenvolvimento. Você pode adquirir uma licença de teste gratuita para nível de produção ou uso comercial. De acordo com os requisitos do desenvolvedor, IronBarcode oferece três faixas de preços. Você pode escolher a solução que melhor satisfaça suas demandas. Você pode agora obter um conjunto de cinco produtos Iron Software pelo preço de dois itens da Iron Software. Visite este site para mais informações.

ObserveZXing.NET é uma marca registrada de seu respectivo proprietário. Este site não é afiliado, endossado ou patrocinado pelo ZXing.NET. Todos os nomes de produtos, logotipos e marcas são propriedade de seus respectivos proprietários. As comparações são apenas para fins informativos e refletem informações disponíveis publicamente no momento da redação.

Perguntas frequentes

Como posso gerar um código QR em C#?

Você pode gerar um código QR em C# usando o IronBarcode, utilizando a classe `BarcodeWriter`. Basta definir o conteúdo do código QR, personalizar opções como cor e tamanho e chamar o método `Write` para gerar o código QR.

O que torna o IronBarcode mais robusto que o ZXing.NET?

O IronBarcode oferece recursos aprimorados, como suporte a uma gama mais ampla de formatos de código de barras, recursos avançados de processamento de imagem, como correção de rotação e perspectiva, e a capacidade de criar códigos QR decorados com logotipos e cores. Também é compatível com várias plataformas e oferece suporte comercial.

Posso ler códigos de barras em imagens com imperfeições usando o IronBarcode?

Sim, o IronBarcode consegue ler códigos de barras em imagens com imperfeições, utilizando recursos como correção de rotação, correção de perspectiva e redução de ruído digital, tornando-o eficaz para imagens digitalizadas ou fotográficas.

Quais são os passos para ler um código de barras em C#?

Para ler um código de barras em C#, utilize a classe `BarcodeReader` do IronBarcode. Carregue a imagem que contém o código de barras usando o método `BarcodeReader.QuicklyReadOneBarcode`, que irá decodificar e retornar o conteúdo do código de barras, caso seja reconhecido.

Como o IronBarcode lida com a compatibilidade entre plataformas?

O IronBarcode oferece compatibilidade multiplataforma com Windows, macOS, Linux e Azure, permitindo que você integre funcionalidades de geração e leitura de códigos de barras em diversos aplicativos .NET sem dependências de terceiros.

Quais opções estão disponíveis para personalizar códigos QR com o IronBarcode?

O IronBarcode permite a personalização de códigos QR, ajustando cores, adicionando logotipos para reforçar a marca e configurando níveis de correção de erros para equilibrar tamanho e legibilidade, proporcionando flexibilidade para diversas necessidades estéticas e funcionais.

Existe alguma taxa de licenciamento para usar o IronBarcode em aplicações comerciais?

A IronBarcode oferece diferentes opções de licenciamento, incluindo uma licença perpétua adequada para aplicações comerciais. Isso contrasta com o ZXing.NET, que é gratuito, mas possui restrições para uso comercial.

Quais são os cenários comuns de resolução de problemas ao usar bibliotecas de códigos de barras?

Problemas comuns podem incluir reconhecimento incorreto de código de barras devido à baixa qualidade da imagem, formatos de código de barras não suportados ou erros de configuração. O processamento avançado de imagens do IronBarcode pode ajudar a mitigar alguns desses problemas de reconhecimento.

Por que alguém escolheria o IronBarcode em vez do ZXing.NET para manipulação de códigos de barras?

O IronBarcode oferece uma API mais robusta, melhor tratamento de erros, amplo suporte a formatos de código de barras e recursos para gerar códigos QR visualmente personalizados, tudo isso com o benefício adicional de licenciamento comercial e suporte profissional.

Como instalar o IronBarcode em um projeto .NET?

Você pode instalar o IronBarcode em um projeto .NET usando o Gerenciador de Pacotes NuGet no Visual Studio, pesquisando por 'IronBarcode' e adicionando-o ao seu projeto, garantindo fácil integração e atualizações.

Curtis Chau
Redator Técnico

Curtis Chau é bacharel em Ciência da Computação (Universidade Carleton) e se especializa em desenvolvimento front-end, com experiência em Node.js, TypeScript, JavaScript e React. Apaixonado por criar interfaces de usuário intuitivas e esteticamente agradáveis, Curtis gosta de trabalhar com frameworks modernos e criar manuais ...

Leia mais

Iron Support Team

We're online 24 hours, 5 days a week.
Chat
Email
Call Me