Ir para o conteúdo do rodapé
USANDO O IRONQR

Código QR .NET Core: Leia e gere códigos QR em C#

Ao construir aplicativos web ou empresariais no .NET Core, o suporte de código QR - para rastreamento de inventário, fluxos de pagamento ou autenticação de dois fatores - é uma exigência frequente. Em vez de gastar ciclos de desenvolvimento em algoritmos de codificação de baixo nível, você pode optar por uma biblioteca dedicada que lida com todo o fluxo de trabalho. IronQR fornece uma solução completa de código QR for .NET, cobrindo tudo, desde geração básica até leitura com tecnologia ML e correção de erros avançada.

Pronto para experimentar por si mesmo? Inicie seu teste gratuito hoje e veja quão rapidamente você pode adicionar funcionalidade de QR ao seu projeto.

NuGet Instalar com NuGet

PM >  Install-Package IronQR

Confira o IronQR no NuGet para uma instalação rápida. Com mais de 10 milhões de downloads, ele está transformando o desenvolvimento de PDFs com C#. Você também pode baixar a DLL .

Como você instala a biblioteca de código QR?

Instalar o IronQR via NuGet leva segundos. Abra o Visual Studio, vá para Ferramentas > Gerenciador de Pacotes NuGet > Gerenciar Pacotes NuGet para Solução, procure por IronQR e clique em Instalar. O pacote tem dependências mínimas e é compatível com Windows, macOS e Linux de imediato.

Install-Package IronQR

O IronQR tem como alvo .NET Core 6, 7, 8, 9, e 10, bem como .NET Framework 4.6.2 e posteriores. Para projetos multiplataforma, uma integração SkiaSharp lida com o processamento de imagem em runtimes não Windows. A biblioteca funciona com aplicações web ASP.NET Core, aplicativos de console e soluções desktop sem configuração adicional de tempo de execução. Uma vez instalado, todos os métodos de extensão e tipos necessários estão disponíveis imediatamente.

Como Ler um Código QR Básico de uma Imagem?

Ler dados de código QR a partir de arquivos de imagem requer apenas algumas linhas de código. A classe QrReader utiliza um modelo avançado de aprendizado de máquina que avalia a qualidade da imagem e seleciona automaticamente o modo de segmento correto, fornecendo resultados precisos mesmo quando a imagem de entrada não é ideal.

using IronQr;
using IronSoftware.Drawing;

// Load image containing QR code
var inputBmp = AnyBitmap.FromFile("qr-sample.png");
// Create QrImageInput from the bitmap
QrImageInput imageInput = new QrImageInput(inputBmp);
// Initialize QR Reader with ML model
QrReader reader = new QrReader();
// Read and decode all QR codes in the image
IEnumerable<QrResult> results = reader.Read(imageInput);
// Output decoded text strings
foreach (var qrCode in results)
{
    Console.WriteLine($"QR Code Value: {qrCode.Value}");
    Console.WriteLine($"URL: {qrCode.Url}");
}
using IronQr;
using IronSoftware.Drawing;

// Load image containing QR code
var inputBmp = AnyBitmap.FromFile("qr-sample.png");
// Create QrImageInput from the bitmap
QrImageInput imageInput = new QrImageInput(inputBmp);
// Initialize QR Reader with ML model
QrReader reader = new QrReader();
// Read and decode all QR codes in the image
IEnumerable<QrResult> results = reader.Read(imageInput);
// Output decoded text strings
foreach (var qrCode in results)
{
    Console.WriteLine($"QR Code Value: {qrCode.Value}");
    Console.WriteLine($"URL: {qrCode.Url}");
}
$vbLabelText   $csharpLabel

Insira o código QR

Gerador de Código QR .NET Core: Leia e Gere Códigos QR com Apenas Algumas Linhas de Código: Imagem 1 - Código QR de Entrada

Saída

Gerador de Código QR .NET Core: Leia e Gere Códigos QR com Apenas Algumas Linhas de Código: Imagem 2 - Exemplo de saída de varredura de Código QR

O método QrReader.Read() processa o QrImageInput e retorna um IEnumerable<QrResult>, onde cada resultado carrega o texto decodificado, o URL se um foi codificado, e a posição espacial do símbolo QR na imagem. A biblioteca aceita arrays de bytes, caminhos de arquivos e objetos AnyBitmap, dando flexibilidade para qualquer arquitetura de projeto -- seja lendo do disco, de um banco de dados ou de uma transmissão ao vivo de câmera.

O modelo de ML subjacente ao leitor distingue IronQR de bibliotecas puramente algorítmicas. Ele lida com imperfeições do mundo real, como borrões de movimento, oclusão parcial e iluminação irregular sem exigir pré-processamento manual ou ajuste de limiar.

Como Extrair Dados Avançados de um Código QR?

Além da decodificação de valor básico, IronQR expõe coordenadas, segmentos de dados brutos e informações em nível de módulo de cada símbolo escaneado. Isso é essencial para fluxos de trabalho de processamento de documentos onde você precisa saber exatamente onde um código QR apareceu na página, ou para aplicações que precisam lidar com vários códigos em uma única imagem.

using IronQr;
using IronSoftware.Drawing;

var inputBmp = AnyBitmap.FromFile("document-with-qr.png");
QrImageInput imageInput = new QrImageInput(inputBmp);
QrReader reader = new QrReader();
IEnumerable<QrResult> results = reader.Read(imageInput);
foreach (var qrCode in results)
{
    // Access decoded value
    Console.WriteLine($"Data: {qrCode.Value}");
    // Get corner coordinate positions
    foreach (PointF point in qrCode.Points)
    {
        Console.WriteLine($"Position: {point.X}, {point.Y}");
    }
}
using IronQr;
using IronSoftware.Drawing;

var inputBmp = AnyBitmap.FromFile("document-with-qr.png");
QrImageInput imageInput = new QrImageInput(inputBmp);
QrReader reader = new QrReader();
IEnumerable<QrResult> results = reader.Read(imageInput);
foreach (var qrCode in results)
{
    // Access decoded value
    Console.WriteLine($"Data: {qrCode.Value}");
    // Get corner coordinate positions
    foreach (PointF point in qrCode.Points)
    {
        Console.WriteLine($"Position: {point.X}, {point.Y}");
    }
}
$vbLabelText   $csharpLabel

Código QR de Entrada

Gerador de Código QR .NET Core: Leia e Gere Códigos QR com Apenas Algumas Linhas de Código: Imagem 3 - Código QR de Entrada

Resultados Avançados de Leitura de QR

Gerador de Código QR .NET Core: Leia e Gere Códigos QR com Apenas Algumas Linhas de Código: Imagem 4 - Resultados para extração avançada de dados QR

A coleção QrResult.Points contém as coordenadas dos quatro cantos do símbolo QR detectado no espaço de pixels. Seu aplicativo pode usar estas para sobrepor caixas delimitadoras em imagens de documentos, recortar a região QR para processamento posterior, ou passar os dados de localização para um sistema a jusante que mapeia coordenadas físicas para posições lógicas de documentos.

O IronQR processa códigos que contêm logotipos personalizados embutidos, módulos danificados ou entrada de baixa resolução através do mesmo pipeline de ML. A biblioteca não requer etapas de pré-processamento separadas -- a detecção e decodificação ocorrem em uma única chamada Read().

Como os Níveis de Correção de Erros Afetam a Qualidade do Código QR?

A correção de erros é o mecanismo que permite que um scanner QR recupere os dados originais mesmo quando parte do código está obscurecida, impressa de forma ruim ou fisicamente danificada. O padrão Código QR define quatro níveis -- Baixo (L), Médio (M), Quartil (Q) e Alto (H) -- cada um trocando capacidade de armazenamento por tolerância a danos.

Nível Capacidade de Recuperação Melhor Uso
L ~7% Displays digitais limpos, máxima densidade de dados
M ~15% Aplicações de impressão geral
Q ~25% Etiquetas industriais, desgaste moderado esperado
H ~30% Logotipos embutidos, superfícies ao ar livre ou de alto desgaste

Ao gerar códigos QR, especificar um nível de correção de erros mais alto garante que a saída resista sob condições reais de escaneamento:

using IronQr;
using IronSoftware.Drawing;

// Configure QR options with high error correction
var qrOptions = new QrOptions(QrErrorCorrectionLevel.High, 20);
// Generate a QR code with specified error correction
QrCode myQr = QrWriter.Write("https://ironsoftware.com", qrOptions);
// Save as PNG image
AnyBitmap qrImage = myQr.Save();
qrImage.SaveAs("high-error-correction-qr.png");
using IronQr;
using IronSoftware.Drawing;

// Configure QR options with high error correction
var qrOptions = new QrOptions(QrErrorCorrectionLevel.High, 20);
// Generate a QR code with specified error correction
QrCode myQr = QrWriter.Write("https://ironsoftware.com", qrOptions);
// Save as PNG image
AnyBitmap qrImage = myQr.Save();
qrImage.SaveAs("high-error-correction-qr.png");
$vbLabelText   $csharpLabel

Saída

Gerador de Código QR .NET Core: Leia e Gere Códigos QR com Apenas Algumas Linhas de Código: Imagem 5 - Código QR Gerado com alto nível de correção de erro

O construtor QrOptions aceita o nível de correção de erro e um número máximo de versão. Códigos de versão 40 armazenam até 7.089 caracteres numéricos, enquanto códigos de versão 1 contêm apenas 41. Definir uma versão máxima inferior limita o tamanho da saída, o que é útil quando você precisa de dimensões físicas consistentes em um lote. Quanto maior o nível de correção de erros, mais módulos são reservados para redundância, reduzindo a capacidade líquida de dados em qualquer versão dada.

A função de tolerância a falhas no IronQR lê junto com essa propriedade – ao ler códigos gerados em níveis de correção mais altos, a biblioteca recupera dados de códigos que falhariam completamente com um decodificador puramente algorítmico.

Como Gerar Códigos QR com Caracteres Internacionais?

IronQR suporta a gama completa de modos de codificação QR: numérico, alfanumérico, byte e Kanji. Para texto japonês e outros conteúdos Unicode, a biblioteca seleciona automaticamente a codificação mais eficiente em termos de espaço:

using IronQr;
using IronSoftware.Drawing;

// Generate QR that encodes Japanese Unicode text
QrCode japaneseQr = QrWriter.Write("こんにちは世界");
// The library selects Kanji mode automatically
AnyBitmap qrImage = japaneseQr.Save();
qrImage.SaveAs("japanese-qr.png");
using IronQr;
using IronSoftware.Drawing;

// Generate QR that encodes Japanese Unicode text
QrCode japaneseQr = QrWriter.Write("こんにちは世界");
// The library selects Kanji mode automatically
AnyBitmap qrImage = japaneseQr.Save();
qrImage.SaveAs("japanese-qr.png");
$vbLabelText   $csharpLabel

Saída de Código QR

Gerador de Código QR .NET Core: Leia e Gere Códigos QR com Apenas Algumas Linhas de Código: Imagem 6 - Código QR de Saída

A codificação Kanji embala dois bytes por módulo em vez de oito bits, por isso um código QR em japonês na mesma versão armazena significativamente mais caracteres do que um equivalente no modo de byte UTF-8. Para conteúdo misto – como uma URL seguida por texto em japonês – IronQR segmenta a entrada e codifica cada segmento no modo mais otimizado. Não é necessário especificar limites de segmento ou chamar auxiliadores de codificação manualmente; o pipeline de codificação lida com isso para você.

Essa seleção automática também abrange marcadores de Interpretação de Canal Estendido (ECI), que sinalizam aos scanners que conjuntos de caracteres não padrão estão em uso. Aplicações voltadas para mercados internacionais podem passar qualquer string Unicode diretamente para QrWriter.Write() sem configuração separada.

Como você utiliza geradores de carga útil para dados QR estruturados?

Um código QR que codifica uma URL simples funciona para compartilhamento de links, mas muitas aplicações precisam codificar dados estruturados -- credenciais de WiFi, cartões de contato no formato vCard ou dados de eventos. Formatar essas cargas úteis manualmente é propenso a erros; um ponto e vírgula faltando ou ordem incorreta dos campos fará com que os scanners interpretem mal os dados.

O IronQR fornece auxiliares de carga útil que constroem essas strings estruturadas corretamente:

using IronQr;
using IronSoftware.Drawing;

// Generate QR code with URL payload
var urlQrCode = QrWriter.Write("https://ironsoftware.com/csharp/qr/");
// Save QR as PNG image file
AnyBitmap qrImage = urlQrCode.Save();
qrImage.SaveAs("url-qr-code.png");
Console.WriteLine("QR code generated successfully.");
using IronQr;
using IronSoftware.Drawing;

// Generate QR code with URL payload
var urlQrCode = QrWriter.Write("https://ironsoftware.com/csharp/qr/");
// Save QR as PNG image file
AnyBitmap qrImage = urlQrCode.Save();
qrImage.SaveAs("url-qr-code.png");
Console.WriteLine("QR code generated successfully.");
$vbLabelText   $csharpLabel

Código QR Criado

Gerador de Código QR .NET Core: Leia e Gere Códigos QR com Apenas Algumas Linhas de Código: Imagem 7 - Código QR criado a partir de um URL

O método QrWriter.Write() aceita uma string simples ou um objeto de carga útil estruturada. Para redes WiFi, a carga útil codifica o SSID, senha e tipo de segurança no formato que scanners Android e iOS reconhecem. Para informações de contato, a saída segue o padrão MeCard usado pela maioria dos leitores de QR móveis. A página de características de geração documenta todos os tipos de carga útil suportados e seus campos exigidos.

A biblioteca gera imagens com dimensões de pixel configuráveis. Para uso em produção, gerar códigos com no mínimo 200x200 pixels garante escaneamento confiável a partir de distâncias típicas de smartphones. Tamanhos maiores beneficiam aplicações ao ar livre ou impressas em que a distância de escaneamento excede um metro.

Como Personalizar a Aparência do Código QR?

O IronQR dá a você controle sobre a aparência visual dos códigos gerados sem sacrificar a capacidade de escaneamento. Você pode mudar as cores de primeiro plano e de fundo, aplicar personalização de marca ou incorporar um logotipo na zona silenciosa no centro.

using IronQr;
using IronSoftware.Drawing;

// Define custom colors for the QR code
var darkColor = Color.FromArgb(30, 30, 120);   // Deep navy foreground
var lightColor = Color.White;

var options = new QrOptions(QrErrorCorrectionLevel.High, maxVersion: 20)
{
    BackgroundColor = lightColor,
    Color = darkColor,
    // Embed a logo image into the QR center
    Logo = AnyBitmap.FromFile("logo.png")
};

QrCode styledQr = QrWriter.Write("https://ironsoftware.com/csharp/qr/", options);
AnyBitmap output = styledQr.Save();
output.SaveAs("branded-qr.png");
using IronQr;
using IronSoftware.Drawing;

// Define custom colors for the QR code
var darkColor = Color.FromArgb(30, 30, 120);   // Deep navy foreground
var lightColor = Color.White;

var options = new QrOptions(QrErrorCorrectionLevel.High, maxVersion: 20)
{
    BackgroundColor = lightColor,
    Color = darkColor,
    // Embed a logo image into the QR center
    Logo = AnyBitmap.FromFile("logo.png")
};

QrCode styledQr = QrWriter.Write("https://ironsoftware.com/csharp/qr/", options);
AnyBitmap output = styledQr.Save();
output.SaveAs("branded-qr.png");
$vbLabelText   $csharpLabel

Incorporar um logotipo reduz a área de dados efetiva, então a biblioteca exige nível de correção de errosHquando um logotipo é fornecido. A zona silenciosa reservada no centro representa cerca de 30% da superfície do código, que está dentro da capacidade de recuperação do nível H. A biblioteca impõe essa restrição automaticamente -- se você definir um nível de correção de erro mais baixo junto com um logotipo, o IronQR levanta uma exceção com uma mensagem descritiva ao invés de produzir um código que escaneia de forma não confiável.

Para aplicações ASP.NET Core, o tutorial do gerador de código QR ASP.NET Core mostra como servir códigos QR gerados como respostas de imagem a partir de uma ação do controlador. O stream de saída grava diretamente na resposta sem I/O de arquivo intermediário, o que mantém a latência baixa para endpoints de alto tráfego.

Como você lê códigos QR em uma aplicação ASP.NET Core?

Escanear códigos QR do lado do servidor -- de imagens carregadas, pipelines de processamento de documentos ou sistemas de inspeção automatizada -- é um caso de uso comum para a API de leitura. O guia de scanner de código QR ASP.NET cobre a configuração completa do controlador e serviço, mas o padrão de leitura principal é o mesmo que uma aplicação console:

using IronQr;
using IronSoftware.Drawing;
using Microsoft.AspNetCore.Mvc;

[ApiController]
[Route("api/qr")]
public class QrScanController : ControllerBase
{
    [HttpPost("scan")]
    public IActionResult Scan(IFormFile imageFile)
    {
        using var stream = imageFile.OpenReadStream();
        var bitmap = AnyBitmap.FromStream(stream);
        var imageInput = new QrImageInput(bitmap);
        var reader = new QrReader();
        var results = reader.Read(imageInput);

        var decoded = results.Select(r => new { r.Value, r.Url }).ToList();
        return Ok(decoded);
    }
}
using IronQr;
using IronSoftware.Drawing;
using Microsoft.AspNetCore.Mvc;

[ApiController]
[Route("api/qr")]
public class QrScanController : ControllerBase
{
    [HttpPost("scan")]
    public IActionResult Scan(IFormFile imageFile)
    {
        using var stream = imageFile.OpenReadStream();
        var bitmap = AnyBitmap.FromStream(stream);
        var imageInput = new QrImageInput(bitmap);
        var reader = new QrReader();
        var results = reader.Read(imageInput);

        var decoded = results.Select(r => new { r.Value, r.Url }).ToList();
        return Ok(decoded);
    }
}
$vbLabelText   $csharpLabel

O método AnyBitmap.FromStream() aceita qualquer fluxo legível, então o mesmo caminho de código funciona para arquivos carregados através de um formulário, imagens buscadas de armazenamento blob, ou quadros extraídos de um pipeline de vídeo. O controlador não grava arquivos temporários no disco, o que é importante para implantações em contêineres onde o sistema de arquivos pode ser somente leitura.

Para cenários de alta vazão, instancie QrReader uma vez por tempo de vida da aplicação como um singleton, já que o custo do carregamento do modelo de ML é pago na primeira construção. Chamadas subsequentes Read() na mesma instância são seguras para thread e compartilham o modelo carregado.

Como você gera códigos QR em uma aplicação .NET MAUI?

O tutorial de código QR .NET MAUI demonstra geração multiplataforma completa em iOS, Android, macOS e Windows. O IronQR usa o backend de renderização SkiaSharp ao rodar em plataformas não Windows, garantindo saída consistente em todos os alvos MAUI.

using IronQr;
using IronSoftware.Drawing;

// Generate QR and convert to a byte array for display in MAUI
QrCode qr = QrWriter.Write("https://ironsoftware.com/csharp/qr/");
AnyBitmap bitmap = qr.Save();
byte[] imageBytes = bitmap.ExportBytes();

// Bind imageBytes to an <Image Source> in your MAUI page
using IronQr;
using IronSoftware.Drawing;

// Generate QR and convert to a byte array for display in MAUI
QrCode qr = QrWriter.Write("https://ironsoftware.com/csharp/qr/");
AnyBitmap bitmap = qr.Save();
byte[] imageBytes = bitmap.ExportBytes();

// Bind imageBytes to an <Image Source> in your MAUI page
$vbLabelText   $csharpLabel

Em alvos móveis, ExportBytes() retorna um array de bytes PNG que você pode alimentar diretamente em um StreamImageSource ou gravar em um ImageButton. O scaffold MAUI não requer caminhos de código específicos da plataforma -- a mesma lógica de geração roda idêntica em todos os quatro alvos MAUI.

Para projetos VB.NET a superfície da API é idêntica; apenas a sintaxe difere. A biblioteca fornece um único pacote NuGet sem necessidade de montagem VB.NET separada.

Quais são os seus próximos passos?

O IronQR cobre o ciclo de vida completo do código QR no .NET -- desde a geração básica e codificação de carga útil estruturada até leitura movida a ML de códigos danificados ou com marca. A biblioteca lida com codificação Kanji, configuração de correção de erros e saída de imagem multiplataforma, deixando você focar na lógica específica para sua aplicação.

Para colocar em prática o que você aprendeu:

Perguntas frequentes

Quais versões do .NET o IronQR suporta?

O IronQR é compatível com .NET Core 6, 7, 8, 9 e 10, bem como com .NET Framework 4.6.2 e versões posteriores. Ele também é compatível com .NET Standard 2.0+, o que o torna compatível com projetos Xamarin, .NET MAUI, Blazor e ASP.NET Core .

Como ler um código QR de um arquivo de imagem em C#?

Carregue a imagem usando `AnyBitmap.FromFile()`, passe-a para um `QrImageInput` e, em seguida, chame `QrReader.Read()`. O método retorna um `IEnumerable`. onde cada resultado contém o valor decodificado, a URL e as coordenadas dos cantos.

Quais são os quatro níveis de correção de erros em códigos QR?

Os quatro níveis são: Baixo (B, recuperação de aproximadamente 7%), Médio (M, aproximadamente 15%), Quartil (Q, aproximadamente 25%) e Alto (A, aproximadamente 30%). Níveis mais altos adicionam módulos de redundância, reduzindo a capacidade líquida de dados, mas melhorando a confiabilidade da leitura em códigos danificados ou parcialmente ocultos.

O IronQR consegue ler códigos QR que contenham um logotipo ou que estejam parcialmente danificados?

Sim. O modelo de detecção baseado em aprendizado de máquina do IronQR lida com códigos parcialmente danificados, logotipos incorporados, desfoque de movimento e entradas de baixa resolução sem exigir pré-processamento manual.

Como incorporar um logotipo em um código QR com o IronQR?

Defina a propriedade `Logo` em um objeto `QrOptions` para um `AnyBitmap` da imagem do seu logotipo e defina o nível de correção de erros como Alto. O IronQR impõe essa restrição automaticamente porque um logotipo centralizado ocupa aproximadamente 30% da superfície do código.

O IronQR suporta caracteres japoneses e outros caracteres Unicode?

Sim. Passe qualquer string Unicode para `QrWriter.Write()` e a biblioteca selecionará automaticamente o modo Kanji para caracteres japoneses ou o modo byte com marcadores ECI para outros conteúdos Unicode.

Como gerar códigos QR em uma aplicação ASP.NET Core ?

Use `AnyBitmap.FromStream()` para ler as imagens enviadas e `QrWriter.Write()` para gerar os códigos. Retorne a saída como um `FileContentResult` com o tipo MIME `image/png`. Instancie `QrReader` como um singleton para amortizar o custo de carregamento do modelo de aprendizado de máquina.

O IronQR é multiplataforma?

Sim. O IronQR utiliza um backend de renderização SkiaSharp em plataformas que não sejam Windows, proporcionando geração e leitura consistentes de QR Codes em macOS, Linux, iOS e Android através do .NET MAUI.

Jordi Bardia
Engenheiro de Software
Jordi é extremamente proficiente em Python, C# e C++, e quando não está utilizando suas habilidades na Iron Software, dedica-se à programação de jogos. Compartilhando as responsabilidades por testes, desenvolvimento e pesquisa de produtos, Jordi agrega imenso valor à melhoria contínua dos produtos. Essa experiência diversificada o mantém ...
Leia mais

Iron Support Team

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