Pruebas en un entorno real
Pruebe en producción sin marcas de agua.
Funciona donde lo necesites.
Los códigos QR se han convertido en omnipresentes en nuestro mundo digital, y se utilizan con frecuencia en publicidad, comercio minorista, gestión de eventos, etc. Para los desarrolladores que trabajan en el marco ASP.NET, la integración de funciones de escaneado de códigos QR en las aplicaciones web puede mejorar la experiencia de usuario y la funcionalidad. Este artículo explora el proceso de implementación de un escáner de códigos QR en una aplicación ASP.NET, cubriendo las herramientas necesarias, las bibliotecas y la implementación paso a paso. UtilizaremosIronQRuna potente biblioteca para la generación de códigos QR a partir deIron Software para leer códigos QR.
Crear un proyecto ASP.NET con Visual Studio
InstaleIronQR biblioteca del Gestor de paquetes
Cargar la imagen QR y leer el QR.
QR(Respuesta rápida) son códigos de barras bidimensionales que pueden almacenar información que va desde URL a datos de contacto, y que suelen escanearse con teléfonos inteligentes o dispositivos de escaneado específicos. En las aplicaciones web, los códigos QR pueden servir para varios propósitos, como:
IronQR es una potente librería .NET diseñada para la generación y escaneo de códigos QR, que proporciona una robusta funcionalidad pensando en la facilidad de uso. Esta versátil biblioteca no sólo gestiona códigos QR, sino también otros tipos de códigos de barras, lo que la convierte en la opción preferida de los desarrolladores que trabajan en el ecosistema .NET. Aquí exploraremos cómo integrar la biblioteca IronQR en una aplicación ASP.NET para facilitar el escaneo de códigos QR.
Lectura de códigos QR:IronQR puede leer códigos QR de varios formatos de imagen, como jpg, png, svg, bmp, gif, tif, tiff, etc. También admite imágenes multipágina y modelos de detección de QR personalizados. Los formatos de datos de salida incluyen texto, URL, coordenadas, etc.
Escribir códigos QR: Puedes generar códigos QR y guardarlos como imágenes(jpg, png, gif, tiff, bmp)o incluso estamparlos en PDF existentes. Codifique datos como texto, URL, bytes y números y genere códigos QR. Personalice el estilo del código QR cambiando el tamaño, ajustando los márgenes, cambiando el color y añadiendo logotipos.
Tratamiento y corrección de errores:IronQR proporciona mensajes de error detallados y corrección de errores QR personalizada. Garantiza la tolerancia a fallos y admite la comprobación de nulos y sumas de comprobación.
Modelo avanzado de aprendizaje automático:IronQR utiliza un modelo avanzado de aprendizaje automático para el reconocimiento de códigos QR. Este modelo garantiza una lectura precisa y fiable de los códigos QR en varias plataformas, incluidos los entornos móviles, de escritorio y en la nube.
Compatibilidad multiplataforma:IronQR está diseñado para C#, F# y VB.NET, y se ejecuta en varias versiones de .NET como .NET Core(8, 7, 6, 5 y 3.1+.).NET Standard(2.0+).NET Framework(4.6.2+)
Admite diferentes tipos de proyectos, incluidos los web(Blazor y WebForms), móvil(Xamarin y MAUI), escritorio(WPF Y MAUI)y aplicaciones de consola.
Amplio soporte de códigos QR: IronQR sobresale en el manejo de una amplia gama de códigos QR y otros tipos de códigos de barras. Ya se trate de códigos QR estándar, códigos Micro QR, una imagen de código de barras QR o incluso formatos específicos como Aztec o Data Matrix,IronQR te tiene cubierto. IronQR también permite leer códigos de barras QR.
IronQR de productos .NET API, que incluye diversas herramientas para documentos ofimáticos, edición de PDF, OCR, etc.
Comience creando un nuevo proyecto y seleccionando la plantilla MVC como se muestra a continuación
A continuación, debe indicar el nombre y la ubicación del proyecto.
Seleccione la versión .NET.
Al hacer clic en el botón crear se creará el siguiente código y proyecto.
InstaleIronQR desde el gestor de paquetes de Visual Studio como se muestra a continuación
IronQR también puede instalarse medianteNuGet Gestor de paquetes.
Ahora, vamos a crear un código QR App.
using System.ComponentModel.DataAnnotations;
namespace IronQRScannerAsp.Models
{
public class QRCodeModel
{
[Display(Name = "Select QR Image")]
public IFormFile QRCodeImage
{
get;
set;
}
}
}
using System.ComponentModel.DataAnnotations;
namespace IronQRScannerAsp.Models
{
public class QRCodeModel
{
[Display(Name = "Select QR Image")]
public IFormFile QRCodeImage
{
get;
set;
}
}
}
Imports System.ComponentModel.DataAnnotations
Namespace IronQRScannerAsp.Models
Public Class QRCodeModel
<Display(Name := "Select QR Image")>
Public Property QRCodeImage() As IFormFile
End Class
End Namespace
Añada un nuevo controlador haciendo clic con el botón derecho del ratón en la carpeta del controlador y asignándole el nombre que se muestra a continuación:
Seleccione Controlador vacío.
Indique el nombre del controlador.
Ahora añade el siguiente código al controlador.
using IronQr;
using IronQRScannerAsp.Models;
using IronSoftware.Drawing;
using Microsoft.AspNetCore.Mvc;
namespace IronQRScannerAsp.Controllers
{
public class QrCodeController : Controller
{
private readonly IWebHostEnvironment _environment;
public QrCodeController(IWebHostEnvironment environment)
{
_environment = environment;
}
public IActionResult Index()
{
ViewBag.QrCodeText = "Text";
return View();
}
[HttpPost]
public IActionResult ScanQRCode(QRCodeModel qrImage)
{
string path = Path.Combine(_environment.WebRootPath, "ScanQRCode");
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
string filePath = Path.Combine(_environment.WebRootPath, "ScanQRCode/qrcode.png");
using (var stream = System.IO.File.Create(filePath))
{
qrImage.QRCodeImage.CopyTo(stream);
}
// Open the asset to read a QR Code from
var bitmap = AnyBitmap.FromFile(filePath);
// Load the asset into QrImageInput
QrImageInput imageInput = new QrImageInput(bitmap);
// Create a QR Reader object
QrReader reader = new QrReader();
// Read the Input an get all embedded QR Codes
IEnumerable<QrResult> results = reader.Read(imageInput);
ViewBag.QrCodeText = results.First().Value;
string imageUrl = $"{this.Request.Scheme}://{this.Request.Host}{this.Request.PathBase}" + "/ScanQRCode/qrcode.png";
ViewBag.QrCodeUri = imageUrl;
return View();
}
}
}
using IronQr;
using IronQRScannerAsp.Models;
using IronSoftware.Drawing;
using Microsoft.AspNetCore.Mvc;
namespace IronQRScannerAsp.Controllers
{
public class QrCodeController : Controller
{
private readonly IWebHostEnvironment _environment;
public QrCodeController(IWebHostEnvironment environment)
{
_environment = environment;
}
public IActionResult Index()
{
ViewBag.QrCodeText = "Text";
return View();
}
[HttpPost]
public IActionResult ScanQRCode(QRCodeModel qrImage)
{
string path = Path.Combine(_environment.WebRootPath, "ScanQRCode");
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
string filePath = Path.Combine(_environment.WebRootPath, "ScanQRCode/qrcode.png");
using (var stream = System.IO.File.Create(filePath))
{
qrImage.QRCodeImage.CopyTo(stream);
}
// Open the asset to read a QR Code from
var bitmap = AnyBitmap.FromFile(filePath);
// Load the asset into QrImageInput
QrImageInput imageInput = new QrImageInput(bitmap);
// Create a QR Reader object
QrReader reader = new QrReader();
// Read the Input an get all embedded QR Codes
IEnumerable<QrResult> results = reader.Read(imageInput);
ViewBag.QrCodeText = results.First().Value;
string imageUrl = $"{this.Request.Scheme}://{this.Request.Host}{this.Request.PathBase}" + "/ScanQRCode/qrcode.png";
ViewBag.QrCodeUri = imageUrl;
return View();
}
}
}
Imports IronQr
Imports IronQRScannerAsp.Models
Imports IronSoftware.Drawing
Imports Microsoft.AspNetCore.Mvc
Namespace IronQRScannerAsp.Controllers
Public Class QrCodeController
Inherits Controller
Private ReadOnly _environment As IWebHostEnvironment
Public Sub New(ByVal environment As IWebHostEnvironment)
_environment = environment
End Sub
Public Function Index() As IActionResult
ViewBag.QrCodeText = "Text"
Return View()
End Function
<HttpPost>
Public Function ScanQRCode(ByVal qrImage As QRCodeModel) As IActionResult
Dim path As String = System.IO.Path.Combine(_environment.WebRootPath, "ScanQRCode")
If Not Directory.Exists(path) Then
Directory.CreateDirectory(path)
End If
Dim filePath As String = System.IO.Path.Combine(_environment.WebRootPath, "ScanQRCode/qrcode.png")
Using stream = System.IO.File.Create(filePath)
qrImage.QRCodeImage.CopyTo(stream)
End Using
' Open the asset to read a QR Code from
Dim bitmap = AnyBitmap.FromFile(filePath)
' Load the asset into QrImageInput
Dim imageInput As New QrImageInput(bitmap)
' Create a QR Reader object
Dim reader As New QrReader()
' Read the Input an get all embedded QR Codes
Dim results As IEnumerable(Of QrResult) = reader.Read(imageInput)
ViewBag.QrCodeText = results.First().Value
Dim imageUrl As String = $"{Me.Request.Scheme}://{Me.Request.Host}{Me.Request.PathBase}" & "/ScanQRCode/qrcode.png"
ViewBag.QrCodeUri = imageUrl
Return View()
End Function
End Class
End Namespace
El fragmento de código proporcionado es para un controlador ASP.NET Core MVC llamado QrCodeController, que está diseñado para manejar las funcionalidades de escaneo de códigos QR utilizando la biblioteca IronQR. He aquí una breve descripción de lo que hace el código:
Construye una ruta de archivo(ruta) dentro del directorio raíz web de la aplicación específicamente para guardar imágenes de códigos QR.("Directorio "ScanQRCode).
Comprueba si este directorio existe, y si no, lo crea para evitar cualquier error de archivo no encontrado al guardar el archivo.
Construye la ruta completa del archivo(rutaarchivo
) donde se guardará la imagen del código QR cargado("ScanQRCode/qrcode.png"). Esto sobrescribe cualquier archivo existente con el mismo nombre, gestionando eficazmente nuevas exploraciones sin acumular archivos.
Abre un flujo de archivos y copia el contenido de la imagen cargada(qrImage.QRCodeImage
, probablemente un archivo de formulario) a la ubicación especificada en el servidor.
Utiliza AnyBitmap.FromFile(filePath)
para cargar el archivo de imagen guardado en un formato adecuado para el escaneo de códigos QR. AnyBitmap
sirve probablemente como clase de ayuda para convertir archivos de imagen en un objeto bitmap que el lector QR pueda procesar.
Envuelve el mapa de bits cargado en un QrImageInput
, que está específicamente diseñado para ser una entrada para el proceso de lectura de códigos QR. Instantiza un QrReader
, un componente de la librería IronQR configurado para detectar y decodificar códigos QR.
Llama a reader.Read(imageInput)
para escanear la imagen de los códigos QR. Este método devuelve un IEnumerable<QrResult>
, donde cada QrResult
contiene datos de un código QR detectado en la imagen. Extrae el valor del primer resultado utilizando results.First().Value
y almacenar esta información decodificada en ViewBag.QrCodeText
. Esto supone que la imagen contiene al menos un código QR y no gestiona posibles errores cuando no se detectan códigos QR.
Construye una URL(imageUrl
) apuntando a la imagen del código QR guardada en el servidor. Esta URL se construye utilizando el esquema, el host y la ruta base de la solicitud HTTP actual, lo que garantiza que los usuarios puedan acceder a ella para visualizarla. La URL construida se guarda en ViewBag.QrCodeUri
.
Devuelve la misma vista(Ver())que probablemente muestre al usuario tanto la imagen del código QR como el texto descodificado. El
ViewBag` se utiliza para pasar el texto decodificado del código QR y la URL de la imagen a la vista para su renderización.
Añade una nueva vista, haz click con el botón derecho en el método de acción CreateQRCode
de la clase QrCodeController
.
Seleccione la opción "Añadir vista" y, a continuación, "Vista Razor". Haga clic en "Añadir".
A continuación, seleccione la plantilla "Crear" y la clase Modelo generada anteriormente.
Ahora sustituye el código de la clase view por el que se muestra a continuación.
@model IronQRScannerAsp.Models.QRCodeModel
@{
ViewData["Title"] = "ScanQRCode";
}
<h1>ScanQRCode</h1>
<h4>QRCodeModel</h4>
<hr />
<div class="row">
<div class="col-md-14">
<form asp-action="ScanQRCode" enctype="multipart/form-data">
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<div class="form-group">
</div>
<div class="form-group">
<h3>Scanned Text:</h3>
<h4>@ViewBag.QrCodeText</h4>
</div>
<div class="form-group">
<img src="@ViewBag.QrCodeUri" class="img-thumbnail" />
</div>
</form>
</div>
</div>
<div>
<a asp-action="Index">Clear</a>
</div>
@section Scripts {
@{
await Html.RenderPartialAsync("_ValidationScriptsPartial");
}
}
@model IronQRScannerAsp.Models.QRCodeModel
@{
ViewData["Title"] = "ScanQRCode";
}
<h1>ScanQRCode</h1>
<h4>QRCodeModel</h4>
<hr />
<div class="row">
<div class="col-md-14">
<form asp-action="ScanQRCode" enctype="multipart/form-data">
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<div class="form-group">
</div>
<div class="form-group">
<h3>Scanned Text:</h3>
<h4>@ViewBag.QrCodeText</h4>
</div>
<div class="form-group">
<img src="@ViewBag.QrCodeUri" class="img-thumbnail" />
</div>
</form>
</div>
</div>
<div>
<a asp-action="Index">Clear</a>
</div>
@section Scripts {
@{
await Html.RenderPartialAsync("_ValidationScriptsPartial");
}
}
model ReadOnly Property () As IronQRScannerAsp.Models.QRCodeModel
ViewData("Title") = "ScanQRCode"
End Property
'INSTANT VB WARNING: An assignment within expression was extracted from the following statement:
'ORIGINAL LINE: <h1> ScanQRCode</h1> <h4> QRCodeModel</h4> <hr /> <div class="row"> <div class="col-md-14"> <form asp-action="ScanQRCode" enctype="multipart/form-data"> <div asp-validation-summary="ModelOnly" class="text-danger"></div> <div class="form-group"> </div> <div class="form-group"> <h3> Scanned Text:</h3> <h4> @ViewBag.QrCodeText</h4> </div> <div class="form-group"> <img src="@ViewBag.QrCodeUri" class="img-thumbnail" /> </div> </form> </div> </div> <div> <a asp-action="Index"> Clear</a> </div> @section Scripts
"form-group"> </div> <div class="form-group"> (Of h3) Scanned Text
Inherits </h3>(Of h4) ViewBag.QrCodeText</h4> </div> <div class="form-group"> <img src="@ViewBag.QrCodeUri" class="img-thumbnail" /> </div> </form> </div> </div> (Of div) <a asp-action="Index"> Clear</a> </div> section Scripts
'INSTANT VB WARNING: An assignment within expression was extracted from the following statement:
'ORIGINAL LINE: Friend <h1> ScanQRCode</h1> <h4> QRCodeModel</h4> <hr /> <div Class="row"> <div class="col-md-14"> <form asp-action="ScanQRCode" enctype="multipart/form-data"> <div asp-validation-summary="ModelOnly" class="text-danger"></div> <div class="form-group"> </div> <div class
"text-danger"></div> <div class="form-group"> </div> <div class
'INSTANT VB WARNING: An assignment within expression was extracted from the following statement:
'ORIGINAL LINE: Private Friend <h1> ScanQRCode</h1> <h4> QRCodeModel</h4> <hr /> <div Class="row"> <div class="col-md-14"> <form asp-action="ScanQRCode" enctype="multipart/form-data"> <div asp-validation-summary="ModelOnly" class="text-danger"></div> <div class
"ModelOnly" class="text-danger"></div> <div class
'INSTANT VB WARNING: An assignment within expression was extracted from the following statement:
'ORIGINAL LINE: Private Private Friend <h1> ScanQRCode</h1> <h4> QRCodeModel</h4> <hr /> <div Class="row"> <div class="col-md-14"> <form asp-action="ScanQRCode" enctype="multipart/form-data"> <div asp-validation-summary="ModelOnly" class
"multipart/form-data"> <div asp-validation-summary="ModelOnly" class
'INSTANT VB WARNING: An assignment within expression was extracted from the following statement:
'ORIGINAL LINE: Private Private Private Friend <h1> ScanQRCode</h1> <h4> QRCodeModel</h4> <hr /> <div Class="row"> <div class="col-md-14"> <form asp-action="ScanQRCode" enctype="multipart/form-data"> <div asp-validation-summary
"ScanQRCode" enctype="multipart/form-data"> <div asp-validation-summary
'INSTANT VB WARNING: An assignment within expression was extracted from the following statement:
'ORIGINAL LINE: Private Private Private Private Friend <h1> ScanQRCode</h1> <h4> QRCodeModel</h4> <hr /> <div Class="row"> <div class="col-md-14"> <form asp-action="ScanQRCode" enctype
"col-md-14"> <form asp-action="ScanQRCode" enctype
'INSTANT VB WARNING: An assignment within expression was extracted from the following statement:
'ORIGINAL LINE: Private Private Private Private Private Friend <h1> ScanQRCode</h1> <h4> QRCodeModel</h4> <hr /> <div Class="row"> <div class="col-md-14"> <form asp-action
"row"> <div class="col-md-14"> <form asp-action
'INSTANT VB WARNING: Instant VB cannot determine whether both operands of this division are integer types - if they are then you should use the VB integer division operator:
Private Private Private Private Private Private Private Friend (Of h1) ScanQRCode</h1> (Of h4) QRCodeModel</h4> <hr /> <div Class="row"> <div class
@
If True Then
Await Html.RenderPartialAsync("_ValidationScriptsPartial")
End If
End Class
Ahora en el program.cs cambia el siguiente código para que la vista anterior sea la ruta por defecto
app.MapControllerRoute(
name: "default",
pattern: "{controller=QrCode}/{action=Index}");
app.MapControllerRoute(
name: "default",
pattern: "{controller=QrCode}/{action=Index}");
app.MapControllerRoute(name:= "default", pattern:= "{controller=QrCode}/{action=Index}")
Esto cambia la ruta por defecto de HomeController
a nuestro controlador QrCode
.
Imagen de entrada con URL: https://ironsoftware.com/csharp/qr.
En la página, seleccione una imagen de código QR y haga clic en cargar para descodificar el código QR. Esta aplicación también puede modificarse para leer un vídeo y mostrar los resultados.
Para leer códigos QR avanzados, IronQR proporciona los siguientes ajustes.
using IronQr;
using IronSoftware.Drawing;
using IronQr.Enum;
using System.Collections.Generic;
var inputBmp = AnyBitmap.FromFile("QrImage.png");
// Use Auto => Machine Learning Scan
// Careful Scan => Useful for scanning documents slowly and carefully
QrImageInput scan_ML_and_normal = new QrImageInput(inputBmp, QrScanMode.OnlyDetectionModel);
IEnumerable<QrResult> results1 = new QrReader().Read(scan_ML_and_normal);
// Use Machine Learning Scan
// High Speed => For scanning frames from a camera
QrImageInput scan_ML_only = new QrImageInput(inputBmp, QrScanMode.OnlyDetectionModel);
IEnumerable<QrResult> results2 = new QrReader().Read(scan_ML_only);
// Use Scan without Machine Learning
QrImageInput scan_normal_only = new QrImageInput(inputBmp, QrScanMode.OnlyBasicScan);
IEnumerable<QrResult> results3 = new QrReader().Read(scan_normal_only);
using IronQr;
using IronSoftware.Drawing;
using IronQr.Enum;
using System.Collections.Generic;
var inputBmp = AnyBitmap.FromFile("QrImage.png");
// Use Auto => Machine Learning Scan
// Careful Scan => Useful for scanning documents slowly and carefully
QrImageInput scan_ML_and_normal = new QrImageInput(inputBmp, QrScanMode.OnlyDetectionModel);
IEnumerable<QrResult> results1 = new QrReader().Read(scan_ML_and_normal);
// Use Machine Learning Scan
// High Speed => For scanning frames from a camera
QrImageInput scan_ML_only = new QrImageInput(inputBmp, QrScanMode.OnlyDetectionModel);
IEnumerable<QrResult> results2 = new QrReader().Read(scan_ML_only);
// Use Scan without Machine Learning
QrImageInput scan_normal_only = new QrImageInput(inputBmp, QrScanMode.OnlyBasicScan);
IEnumerable<QrResult> results3 = new QrReader().Read(scan_normal_only);
Imports IronQr
Imports IronSoftware.Drawing
Imports IronQr.Enum
Imports System.Collections.Generic
Private inputBmp = AnyBitmap.FromFile("QrImage.png")
' Use Auto => Machine Learning Scan
' Careful Scan => Useful for scanning documents slowly and carefully
Private scan_ML_and_normal As New QrImageInput(inputBmp, QrScanMode.OnlyDetectionModel)
Private results1 As IEnumerable(Of QrResult) = (New QrReader()).Read(scan_ML_and_normal)
' Use Machine Learning Scan
' High Speed => For scanning frames from a camera
Private scan_ML_only As New QrImageInput(inputBmp, QrScanMode.OnlyDetectionModel)
Private results2 As IEnumerable(Of QrResult) = (New QrReader()).Read(scan_ML_only)
' Use Scan without Machine Learning
Private scan_normal_only As New QrImageInput(inputBmp, QrScanMode.OnlyBasicScan)
Private results3 As IEnumerable(Of QrResult) = (New QrReader()).Read(scan_normal_only)
Aprovechando lo último en tecnología ML, hemos elevado el lector de códigos QR a nuevas cotas. El sofisticado modelo ML mejora la precisión y eficacia de las aplicaciones en la descodificación de códigos QR, incluso en condiciones complejas. Tanto si se trata de leer códigos QR de imágenes fijas, secuencias de vídeo o secuencias de cámaras en directo, la solución basada en ML proporciona la información necesaria de forma rápida y fiable. Esta innovación agiliza la recuperación de datos y aumenta la seguridad al identificar los códigos QR auténticos y señalar las amenazas potenciales. Con nuestra tecnología ML, puede estar seguro de que sus capacidades de escaneado de códigos QR están a la vanguardia, proporcionando a sus usuarios una experiencia fluida y segura.
Los desarrolladores pueden obtener una licencia de prueba de IronQR enaquí. La clave debe colocarse en appSettings.json.
{
"IronQR.License.LicenseKey": "My key"
}
En este artículo, hemos explorado cómo escanear códigos QR en ASP.NET Core utilizandoIronQR. Integración deIronQR en una aplicación ASP.NET para escanear códigos QR es un proceso sencillo que mejora las capacidades de las aplicaciones web, haciéndolas más interactivas y fáciles de usar. IronQRy su facilidad de uso lo convierten en una opción excelente para los desarrolladores que deseen implantar funciones relacionadas con los códigos de barras.
9 productos API .NET para sus documentos de oficina