Saltar al pie de página
USANDO IRONQR

Código QR .NET Core: Leer y generar códigos QR en C#

Al desarrollar aplicaciones web o empresariales en .NET Core, la compatibilidad con códigos QR (para seguimiento de inventario, flujos de pago o autenticación de dos factores) es un requisito frecuente. En lugar de gastar ciclos de desarrollo en algoritmos de codificación de bajo nivel, puede recurrir a una biblioteca dedicada que maneje todo el flujo de trabajo. IronQR ofrece una solución completa de códigos QR for .NET, que abarca todo, desde la generación básica hasta la lectura impulsada por ML y la corrección avanzada de errores.

¿Estás listo para probarlo tú mismo? Comience su prueba gratuita hoy y vea qué tan rápido puede agregar la funcionalidad QR a su proyecto.

NuGet Instalar con NuGet

PM >  Install-Package IronQR

Echa un vistazo a IronQR en NuGet para una instalación rápida. Con más de 10 millones de descargas, está transformando el desarrollo de PDF con C#. También puede descargar el DLL.

¿Cómo instalar la biblioteca de códigos QR?

La instalación de IronQR a través de NuGet lleva unos segundos. Abra Visual Studio, vaya a Herramientas > Administrador de paquetes NuGet > Administrar paquetes NuGet para la solución , busque IronQR y haga clic en Instalar . El paquete tiene dependencias mínimas y está destinado a Windows, macOS y Linux desde el primer momento.

Install-Package IronQR

IronQR está dirigido a .NET Core 6, 7, 8, 9 y 10, así como a .NET Framework 4.6.2 y versiones posteriores. Para proyectos multiplataforma, una integración de SkiaSharp maneja el procesamiento de imágenes en entornos de ejecución que no son Windows. La biblioteca funciona con aplicaciones web ASP.NET Core , aplicaciones de consola y soluciones de escritorio sin configuración de tiempo de ejecución adicional. Una vez instalado, todos los métodos y tipos de extensión necesarios estarán disponibles inmediatamente.

¿Cómo leer un código QR básico a partir de una imagen?

Para leer datos de códigos QR desde archivos de imagen solo se requieren unas pocas líneas de código. La clase QrReader utiliza un modelo de aprendizaje automático avanzado que evalúa la calidad de la imagen y selecciona automáticamente el modo de segmento correcto, lo que le brinda resultados precisos incluso cuando la imagen de entrada no es 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

Introducir código QR

Generador de códigos QR .NET Core: lea y genere códigos QR con solo unas pocas líneas de código: Imagen 1 - Código QR de entrada

Resultado

Generador de códigos QR .NET Core: lea y genere códigos QR con solo unas pocas líneas de código: Imagen 2 - Ejemplo de salida de escaneo de código QR

El método QrReader.Read() procesa el QrImageInput y devuelve un IEnumerable<QrResult>, donde cada resultado lleva el texto decodificado, la URL si se codificó una y la posición espacial del símbolo QR en la imagen. La biblioteca acepta matrices de bytes, rutas de archivos y objetos AnyBitmap, lo que le brinda flexibilidad para cualquier arquitectura de proyecto, ya sea que esté leyendo desde un disco, una base de datos o una transmisión de cámara en vivo.

El modelo ML que sustenta al lector distingue a IronQR de las bibliotecas puramente algorítmicas. Maneja imperfecciones del mundo real, como desenfoque de movimiento, oclusión parcial e iluminación desigual, sin necesidad de preprocesamiento manual ni ajuste de umbral.

¿Cómo se extraen datos de códigos QR avanzados?

Más allá de la decodificación de valores básicos, IronQR expone coordenadas, segmentos de datos sin procesar e información a nivel de módulo de cada símbolo escaneado. Esto es esencial para los flujos de trabajo de procesamiento de documentos donde necesita saber exactamente dónde apareció un código QR en la página, o para aplicaciones que deben manejar múltiples códigos en una sola imagen.

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

QR de entrada

Generador de códigos QR .NET Core: lea y genere códigos QR con solo unas pocas líneas de código: Imagen 3 - Ingrese el código QR

Resultados de la lectura avanzada de QR

Generador de códigos QR .NET Core: lea y genere códigos QR con solo unas pocas líneas de código: Imagen 4 - Resultados de la extracción avanzada de datos QR

La colección QrResult.Points contiene las cuatro coordenadas de las esquinas del símbolo QR detectado en el espacio de píxeles. Su aplicación puede usarlos para superponer cuadros delimitadores en imágenes de documentos, recortar la región QR para un procesamiento posterior o pasar los datos de ubicación a un sistema posterior que asigna coordenadas físicas a posiciones lógicas del documento.

IronQR procesa códigos que contienen logotipos personalizados incrustados, módulos dañados o entradas de baja resolución a través de la misma canalización de aprendizaje automático. La biblioteca no requiere pasos de preprocesamiento independientes: la detección y la decodificación se realizan en una sola llamada Read().

¿Cómo afectan los niveles de corrección de errores a la calidad del código QR?

La corrección de errores es el mecanismo que permite a un escáner QR recuperar los datos originales incluso cuando parte del código está oscurecido, mal impreso o dañado físicamente. El estándar del código QR define cuatro niveles: Bajo (L), Medio (M), Cuartil (Q) y Alto (H), cada uno de los cuales intercambia capacidad de almacenamiento por tolerancia al daño.

Nivel Capacidad de recuperación Mejor uso
L ~7% Pantallas digitales limpias, máxima densidad de datos
METRO ~15% Aplicaciones generales de impresión
Q ~25% Etiquetas industriales, se espera un desgaste moderado
H ~30% Logotipos incrustados, superficies exteriores o de alto desgaste

Al generar códigos QR, especificar un nivel de corrección de errores más alto garantiza que el resultado se mantenga en condiciones de escaneo reales:

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

Resultado

Generador de códigos QR .NET Core: lea y genere códigos QR con solo unas pocas líneas de código: Imagen 5 - Código QR generado con alto nivel de corrección de errores

El constructor QrOptions acepta el nivel de corrección de errores y un número de versión máximo. Los códigos de la versión 40 almacenan hasta 7089 caracteres numéricos, mientras que los códigos de la versión 1 solo tienen 41. Establecer una versión máxima inferior restringe el tamaño de salida, lo que resulta útil cuando se necesitan dimensiones físicas consistentes en un lote. Cuanto mayor sea el nivel de corrección de errores, más módulos se reservarán para redundancia, lo que reducirá la capacidad neta de datos en cualquier versión determinada.

La función de tolerancia a fallas de IronQR se lee junto con esta propiedad: al leer códigos generados con niveles de corrección más altos, la biblioteca recupera datos de códigos que fallarían por completo con un decodificador puramente algorítmico.

¿Cómo generar códigos QR con caracteres internacionales?

IronQR admite la gama completa de modos de codificación QR : numérico, alfanumérico, byte y kanji. Para texto en japonés y otros contenidos Unicode, la biblioteca selecciona automáticamente la codificación que ahorra más espacio:

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

Salida de código QR

Generador de códigos QR .NET Core: Lea y genere códigos QR con solo unas pocas líneas de código: Imagen 6 - Código QR de salida

La codificación kanji empaqueta dos bytes por módulo en lugar de ocho bits, por lo que un código QR en japonés de la misma versión almacena significativamente más caracteres que un equivalente en modo byte UTF-8. Para contenido mixto (como una URL seguida de texto en japonés), IronQR segmenta la entrada y codifica cada segmento en el modo óptimo. No es necesario especificar límites de segmentos ni llamar a ayudantes de codificación manualmente; El proceso de codificación se encarga de esto por usted.

Esta selección automática también cubre los marcadores de interpretación de canal extendido (ECI), que indican a los escáneres que se están utilizando conjuntos de caracteres no estándar. Las aplicaciones dirigidas a los mercados internacionales pueden pasar cualquier cadena Unicode directamente a QrWriter.Write() sin necesidad de una configuración independiente.

¿Cómo se utilizan generadores de carga útil para datos QR estructurados?

Un código QR que codifica una URL simple funciona para compartir enlaces simples, pero muchas aplicaciones necesitan codificar datos estructurados (credenciales de WiFi, tarjetas de contacto en formato vCard o datos de eventos). Formatear estas cargas útiles manualmente es propenso a errores; Un punto y coma faltante o un orden de campos incorrecto harán que los escáneres malinterpreten los datos.

IronQR proporciona ayudantes de carga útil que construyen estas cadenas estructuradas correctamente:

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 creado

Generador de códigos QR .NET Core: lea y genere códigos QR con solo unas pocas líneas de código: Imagen 7: Código QR creado a partir de una URL

El método QrWriter.Write() acepta una cadena simple o un objeto de carga útil estructurado. Para redes wifi, la carga útil codifica el SSID, la contraseña y el tipo de seguridad en el formato que reconocen los escáneres de Android e iOS. Para la información de contacto, la salida sigue el estándar MeCard, utilizado por la mayoría de los lectores QR móviles. La página de funciones de generación documenta todos los tipos de carga útil admitidos y sus campos obligatorios.

La biblioteca genera imágenes con dimensiones de píxeles configurables. Para uso en producción, la generación de códigos de un mínimo de 200 x 200 píxeles garantiza un escaneo confiable desde distancias típicas de teléfonos inteligentes. Los tamaños más grandes son beneficiosos para aplicaciones impresas o en exteriores donde la distancia de escaneo supera el metro.

¿Cómo personalizar la apariencia del código QR?

IronQR le brinda control sobre la apariencia visual de los códigos generados sin sacrificar la capacidad de escaneo. Puede cambiar los colores de primer plano y de fondo, aplicar una marca personalizada o incrustar un logotipo en la zona tranquila del 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

Incrustar un logotipo reduce el área de datos efectiva, por lo que la biblioteca requiere un nivel de corrección de errores H cuando se proporciona un logotipo. La zona tranquila reservada en el centro representa aproximadamente el 30% de la superficie del código, que está dentro de la capacidad de recuperación del nivel H. La biblioteca aplica esta restricción automáticamente: si establece un nivel de corrección de errores más bajo junto con un logotipo, IronQR genera una excepción con un mensaje descriptivo en lugar de producir un código que se escanea de manera poco confiable.

Para las aplicaciones ASP.NET Core , el tutorial del generador de códigos QR de ASP.NET Core muestra cómo servir códigos QR generados como respuestas de imágenes de una acción del controlador. El flujo de salida escribe directamente en la respuesta sin E/S de archivo intermedia, lo que mantiene la latencia baja para los puntos finales de alto tráfico.

¿Cómo se leen códigos QR en una aplicación ASP.NET Core ?

El escaneo de códigos QR del lado del servidor (desde imágenes cargadas, canales de procesamiento de documentos o sistemas de inspección automatizados) es un caso de uso común para la API de lectura. La guía del escáner de código QR ASP.NET cubre la configuración completa del controlador y del servicio, pero el patrón de lectura principal es el mismo que el de una aplicación de consola:

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

El método AnyBitmap.FromStream() acepta cualquier flujo legible, por lo que la misma ruta de código funciona para archivos subidos a través de un formulario, imágenes obtenidas del almacenamiento de blobs o fotogramas extraídos de una canalización de vídeo. El controlador no escribe archivos temporales en el disco, lo cual es importante para implementaciones en contenedores donde el sistema de archivos puede ser de solo lectura.

Para escenarios de alto rendimiento, cree una instancia de QrReader una vez por vida útil de la aplicación como singleton, ya que el costo de carga del modelo ML se paga en la primera construcción. Las llamadas Read() subsiguientes en la misma instancia son seguras para subprocesos y comparten el modelo cargado.

¿Cómo generar códigos QR en una aplicación .NET MAUI ?

El tutorial del código QR .NET MAUI demuestra la generación multiplataforma completa en iOS, Android, macOS y Windows. IronQR utiliza el backend de renderizado SkiaSharp cuando se ejecuta en plataformas que no son Windows, lo que proporciona una salida consistente en todos los objetivos 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

En destinos móviles, ExportBytes() devuelve una matriz de bytes PNG que puedes introducir directamente en un StreamImageSource o escribir en un ImageButton. El andamio MAUI no requiere rutas de código específicas de la plataforma: la misma lógica de generación se ejecuta de manera idéntica en los cuatro objetivos MAUI.

Para los proyectos VB .NET , la superficie de la API es idéntica; Sólo difiere la sintaxis. La biblioteca envía un único paquete NuGet sin necesidad de un ensamblaje VB .NET separado.

¿Cuales son tus próximos pasos?

IronQR cubre el ciclo de vida completo del código QR en .NET , desde la generación básica y la codificación de carga estructurada hasta la lectura impulsada por ML de códigos dañados o de marca. La biblioteca maneja la codificación Kanji, la configuración de corrección de errores y la salida de imágenes multiplataforma, lo que le permite concentrarse en la lógica específica de su aplicación.

Para poner en práctica lo aprendido:

Preguntas Frecuentes

¿Qué versiones de .NET admite IronQR ?

IronQR es compatible con .NET Core 6, 7, 8, 9 y 10, así como con .NET Framework 4.6.2 y versiones posteriores. También es compatible con .NET Standard 2.0 y versiones posteriores, lo que lo hace compatible con proyectos de Xamarin, .NET MAUI, Blazor y ASP.NET Core .

¿Cómo leer un código QR de un archivo de imagen en C#?

Cargue la imagen con `AnyBitmap.FromFile()`, pásela a `QrImageInput` y luego llame a `QrReader.Read()`. El método devuelve un `IEnumerable`. " donde cada resultado contiene el valor decodificado, la URL y las coordenadas de las esquinas.

¿Cuáles son los cuatro niveles de corrección de errores del código QR?

Los cuatro niveles son Bajo (L, ~7% de recuperación), Medio (M, ~15%), Cuartil (Q, ~25%) y Alto (H, ~30%). Los niveles superiores añaden módulos de redundancia, lo que reduce la capacidad neta de datos, pero mejora la fiabilidad del escaneo en códigos dañados o parcialmente ocultos.

¿Puede IronQR leer códigos QR que contengan un logotipo o estén parcialmente dañados?

Sí. El modelo de detección impulsado por ML en IronQR maneja códigos parcialmente dañados, logotipos incrustados, desenfoque de movimiento y entradas de baja resolución sin necesidad de preprocesamiento manual.

¿Cómo incrustar un logotipo en un código QR con IronQR?

Establezca la propiedad `Logo` en un objeto `QrOptions` como `AnyBitmap` de la imagen de su logotipo y configure el nivel de corrección de errores en Alto. IronQR aplica esta restricción automáticamente, ya que un logotipo centrado ocupa aproximadamente el 30 % de la superficie del código.

¿ IronQR admite caracteres japoneses y otros caracteres Unicode?

Sí. Pase cualquier cadena Unicode a `QrWriter.Write()` y la biblioteca seleccionará automáticamente el modo Kanji para caracteres japoneses o el modo byte con marcadores ECI para otro contenido Unicode.

¿Cómo generar códigos QR en una aplicación ASP.NET Core ?

Utilice `AnyBitmap.FromStream()` para leer las imágenes cargadas y `QrWriter.Write()` para generar códigos. Devuelva la salida como `FileContentResult` con el tipo MIME `image/png`. Cree una instancia de `QrReader` como singleton para amortizar el coste de carga del modelo de aprendizaje automático.

¿ IronQR es multiplataforma?

Sí. IronQR utiliza un backend de renderizado SkiaSharp en plataformas que no son Windows, lo que proporciona generación y lectura de QR consistente en macOS, Linux, iOS y Android a través de .NET MAUI.

Jordi Bardia
Ingeniero de Software
Jordi es más competente en Python, C# y C++. Cuando no está aprovechando sus habilidades en Iron Software, está programando juegos. Compartiendo responsabilidades para pruebas de productos, desarrollo de productos e investigación, Jordi agrega un valor inmenso a la mejora continua del producto. La experiencia variada lo mantiene ...
Leer más

Iron Support Team

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