C# Aplicación generadora de códigos QR

This article was translated from English: Does it need improvement?
Translated
View the article in English

Bienvenido a nuestra guía para crearCódigos QR con C#! Los códigos QR y los DLL de código de barras .NET se han convertido en formas populares de compartir información de forma rápida y eficaz. Tanto si está desarrollando una aplicación, gestionando un sitio web o simplemente buscando una forma ordenada de compartir enlaces, estos códigos pueden ser increíblemente útiles. En esta guía, le mostraremos cómo generar códigos QR de forma eficaz utilizandoIronQR, lo que le permite generar códigos QR adaptados a sus necesidades. Esta librería facilita a cualquiera que trabaje con C# la creación de códigos QR sin entrar en lógicas complejas. Le guiaremos paso a paso para asegurarnos de que tiene todo lo que necesita para empezar. Si quieres añadir la funcionalidad de generador de códigos QR a tu aplicación o simplemente tienes curiosidad por saber cómo se hace, estás en el lugar adecuado. Empecemos.

Instalar biblioteca generadora de códigos QR en C#

Comience a usar IronQR en su proyecto hoy con una prueba gratuita.

Primer Paso:
green arrow pointer


Antes de empezar tenemos que instalar el IronQR Paquete NuGet.

Install-Package IronQR

IronQR: Biblioteca QR C

IronQR es una biblioteca de códigos QR en C# para integrar la funcionalidad de códigos QR en aplicaciones .NET. IronQR es compatible con una amplia gama de versiones de .NET y tipos de proyectos, incluidos C#, VB.NET, F#, .NET Core, .NET Standard, .NET Framework, etc., lo que garantiza la compatibilidad con diversos entornos de desarrollo, como Windows, Linux, macOS, iOS y Android.

IronQR se distingue por sus funciones avanzadas, incluida la capacidad deleer códigos QR ygenerar códigos QRAdemás, la aplicación es compatible con varios formatos de imagen y ofrece opciones de personalización como cambiar el tamaño, aplicar estilos y añadir logotipos a los códigos QR.

Algunas características clave de IronQR

IronQR amplía su funcionalidad más allá de la generación básica de códigos QR, ofreciendo varias funciones diseñadas para adaptarse a una amplia gama de tareas relacionadas con los códigos QR. Vamos a ver estas características y comprobar sus códigos de ejemplo que usted será capaz de integrar en cualquier tipo de plantilla de aplicación .NET como aplicación de consola.

Leer códigos QR

IronQR destaca en la descodificación de códigos QR, proporcionando a los usuarios una forma sencilla de acceder a la información incrustada en los códigos QR. Puede extraer datos de los códigos QR de forma rápida y precisa, desde simples URL hasta información compleja incrustada.

:path=/static-assets/qr/content-code-examples/tutorials/csharp-qr-code-generator-application-1.cs
using IronQr;
using IronSoftware.Drawing;
using System;
using System.Collections.Generic;

IronQr.License.LicenseKey = "License-Key";

// Load the image file that contains the QR Code
var inputImage = AnyBitmap.FromFile("QRCode.png");

// Prepare the image for QR code detection
QrImageInput qrInput = new QrImageInput(inputImage);

// Initialize the QR Code reader
QrReader qrReader = new QrReader();

// Execute QR Code reading on the provided image
IEnumerable<QrResult> qrResults = qrReader.Read(qrInput);

// Assuming you have the QR results in qrResults as before
foreach (var result in qrResults)
{
    Console.WriteLine(result.Value); // Print the QR code content to the console
}
Imports IronQr
Imports IronSoftware.Drawing
Imports System
Imports System.Collections.Generic

IronQr.License.LicenseKey = "License-Key"

' Load the image file that contains the QR Code
Dim inputImage = AnyBitmap.FromFile("QRCode.png")

' Prepare the image for QR code detection
Dim qrInput As New QrImageInput(inputImage)

' Initialize the QR Code reader
Dim qrReader As New QrReader()

' Execute QR Code reading on the provided image
Dim qrResults As IEnumerable(Of QrResult) = qrReader.Read(qrInput)

' Assuming you have the QR results in qrResults as before
For Each result In qrResults
	Console.WriteLine(result.Value) ' Print the QR code content to the console
Next result
VB   C#

Utilizamos el siguiente QR para escanear:

C# Crear Imagen de Código QR

Y obtenemos este resultado:

C# Valor QR

El proceso comienza incorporando los espacios de nombres necesarios, IronQr y IronSoftware.Drawing, con una mención específica de Color del espacio de nombres IronSoftware.Drawing para manejar las manipulaciones de imágenes.

Antes de sumergirse en el proceso de lectura de códigos QR, es esencial activar el software con su clave de licencia asignándola a IronQr.License.LicenseKey. A continuación, el código procede a cargar la imagen del código QR desde un archivo utilizando AnyBitmap.FromFile("QRCode.png").

Una vez cargada la imagen, el siguiente paso consiste en prepararla para la detección del código QR. Esta preparación se realiza creando un objeto QrImageInput, que sirve de contenedor para la imagen.

El núcleo de esta función reside en la clase QrReader, que se instanciará y utilizará para realizar la operación de lectura del código QR. El lector analiza la imagen preparada, qrInput, buscando cualquier código QR que contenga. El resultado de esta operación es una colección de objetos QrResult, cada uno de los cuales representa un código QR detectado dentro de la imagen.

Para acceder y utilizar los datos codificados en los códigos QR, el código itera sobre la colección de resultados utilizando un bucle foreach. Cada objeto QrResult contiene propiedades, como el valor del código QR, a las que se puede acceder y visualizar.

Opciones personalizadas del modo de lectura QR

IronQR le ofrece diferentes formas de leer códigos QR a partir de imágenes, lo que lo hace versátil para diversas necesidades. Una opción es el modo de escaneado mixto, que equilibra velocidad y precisión, útil cuando los códigos QR no son claros o están parcialmente ocultos.

Otra es el aprendizaje automático(ML) Modo Escanear, que utiliza tecnología inteligente para leer códigos QR dañados o que no son fáciles de leer normalmente. Este modo es ideal para situaciones difíciles en las que los códigos QR son difíciles de detectar.

Por último, está el modo de escaneo básico, que es la forma más rápida y sencilla de escanear códigos QR claros y directos. Es lo mejor cuando necesitas resultados rápidos y los códigos QR son fáciles de leer.

:path=/static-assets/qr/content-code-examples/tutorials/csharp-qr-code-generator-application-2.cs
using IronQr;
using IronQr.Enum;
using IronSoftware.Drawing;
using System.Collections.Generic;

IronQr.License.LicenseKey = "License-Key";

// Load the image file that contains the QR Code
var inputImage = AnyBitmap.FromFile("QRCode.png");

QrImageInput mixedScanInput = new QrImageInput(inputImage, QrScanMode.OnlyDetectionModel);
IEnumerable<QrResult> mixedScanResults = new QrReader().Read(mixedScanInput);

QrImageInput mlScanInput = new QrImageInput(inputImage, QrScanMode.OnlyDetectionModel);
IEnumerable<QrResult> mlScanResults = new QrReader().Read(mlScanInput);

QrImageInput basicScanInput = new QrImageInput(inputImage, QrScanMode.OnlyBasicScan);
IEnumerable<QrResult> basicScanResults = new QrReader().Read(basicScanInput);
Imports IronQr
Imports IronQr.Enum
Imports IronSoftware.Drawing
Imports System.Collections.Generic

IronQr.License.LicenseKey = "License-Key"

' Load the image file that contains the QR Code
Dim inputImage = AnyBitmap.FromFile("QRCode.png")

Dim mixedScanInput As New QrImageInput(inputImage, QrScanMode.OnlyDetectionModel)
Dim mixedScanResults As IEnumerable(Of QrResult) = (New QrReader()).Read(mixedScanInput)

Dim mlScanInput As New QrImageInput(inputImage, QrScanMode.OnlyDetectionModel)
Dim mlScanResults As IEnumerable(Of QrResult) = (New QrReader()).Read(mlScanInput)

Dim basicScanInput As New QrImageInput(inputImage, QrScanMode.OnlyBasicScan)
Dim basicScanResults As IEnumerable(Of QrResult) = (New QrReader()).Read(basicScanInput)
VB   C#

Leer códigos QR por adelantado

Las funciones avanzadas de lectura de códigos QR de IronQR están diseñadas para ofrecer un enfoque completo y matizado de la lectura y descodificación de códigos QR. Este conjunto de características va más allá de las funcionalidades básicas de lectura de códigos QR, proporcionando un nivel más profundo de interacción y extracción de datos.

:path=/static-assets/qr/content-code-examples/tutorials/csharp-qr-code-generator-application-3.cs
using IronQr;
using IronSoftware.Drawing;
using System;
using System.Collections.Generic;

IronQr.License.LicenseKey = "License-Key";

var imageToScan = AnyBitmap.FromFile("QRCode.png");

QrImageInput qrInput = new QrImageInput(imageToScan);

QrReader qrScanner = new QrReader();

IEnumerable<QrResult> scanResults = qrScanner.Read(qrInput);

foreach (QrResult qrResult in scanResults)
{

    Console.WriteLine(qrResult.Value);

    Console.WriteLine(qrResult.Url);

    foreach (IronSoftware.Drawing.PointF coordinate in qrResult.Points)
    {
        Console.WriteLine($"{coordinate.X}, {coordinate.Y}");
    }
}
Imports IronQr
Imports IronSoftware.Drawing
Imports System
Imports System.Collections.Generic

IronQr.License.LicenseKey = "License-Key"

Dim imageToScan = AnyBitmap.FromFile("QRCode.png")

Dim qrInput As New QrImageInput(imageToScan)

Dim qrScanner As New QrReader()

Dim scanResults As IEnumerable(Of QrResult) = qrScanner.Read(qrInput)

For Each qrResult As QrResult In scanResults

	Console.WriteLine(qrResult.Value)

	Console.WriteLine(qrResult.Url)

	For Each coordinate As IronSoftware.Drawing.PointF In qrResult.Points
		Console.WriteLine($"{coordinate.X}, {coordinate.Y}")
	Next coordinate
Next qrResult
VB   C#

Esta es la salida cuando escaneamos el código QR usando IronQR:

C# Leer Código QR Resultado

Utilizamos el siguiente código QR:

C# Crear Imagen de Código QR

Cada objeto QrResult proporciona acceso a los datos descodificados(Valor)cualquier URL incrustada(Url)y las coordenadas espaciales(Puntos) del código QR dentro de la imagen.

Para cada código QR detectado, IronQR ofrece información detallada, incluido el contenido exacto y cualquier URL que contenga el código QR. Además, la biblioteca proporciona las coordenadas precisas de las esquinas del código QR en la imagen(a través de la propiedad Puntos).

Para crear un generador de códigos QR utilizando la librería IronQR de códigos QR en una aplicación C#, siga estos pasos cuidadosamente. Esta guía le llevará a través de la configuración de una aplicación de formulario de Windows, la instalación de la biblioteca IronQR, escribiendo el código para generar un código QR, y la comprensión de la salida.

Paso 1: Crear una aplicación Windows en Visual Studio

  • Inicie Visual Studio en su ordenador.
  • Haga clic en el botón "Crear un nuevo proyecto".
  • Seleccione Windows Forms App como tipo de proyecto. Asegúrese de elegir C# como lenguaje.
    Aplicación Windows Forms

    Introduce un nombre para tu proyecto y selecciona la ubicación para guardarlo. A continuación, en la siguiente pantalla, seleccione .NET framework. A continuación, haga clic en Crear.

    Configuración del proyecto

    Creará y abrirá una aplicación Windows forms en Visual Studio.

Paso 2: Instalar la biblioteca IronQR

Ahora es el momento de instalar la librería IronQR en el proyecto. Puede instalar la biblioteca IronQR a través de diferentes métodos. Elige el que más se adapte a tus preferencias:

Instalación mediante el gestor de paquetes NuGet

  • Haga clic con el botón derecho en su proyecto en el Explorador de soluciones y seleccione Administrar paquetes NuGet.
  • Escriba IronQR en el cuadro de búsqueda y pulse Intro.
    Gestión de paquetes NuGet

    Busque IronQR en la lista y haga clic en Instalar junto a él.

    Instalar IronQR

Instalación mediante la consola del gestor de paquetes NuGet

Vaya a Herramientas > Gestor de paquetes NuGet > Consola del gestor de paquetes.

Gestor de paquetes NuGet

Escriba Install-Package IronQR y pulse Intro.

Instalar IronQR

Paso 3: Diseño de la interfaz

Generador de códigos QR

3.1 Encabezado del título

Generar un código QR

Al iniciar la aplicación del generador de códigos QR, los usuarios se encuentran inmediatamente con un llamativo encabezado titulado "QR Generator IronQR", en un tipo de letra llamativo y autoritario. El tipo de letra, Agency FB, se ha elegido por sus líneas limpias y modernas, que transmiten una sensación de eficacia y precisión. Con un tamaño de fuente de 48 puntos, el título es prominente y asertivo, capta la atención del usuario y establece firmemente la identidad de la aplicación.

3.2 Sección de entrada

Introducción de texto para código QR

Código QR Entrada de texto

En el corazón de la sección de entrada se encuentra un componente simple pero fundamental: el cuadro de entrada de texto. Aquí, los usuarios pueden introducir los datos que desean codificar en su código QR. El recuadro es espacioso, da cabida a una cantidad significativa de texto y está situado en un lugar destacado cerca de la parte superior.

Selección del logotipo

Seleccionar logotipo

Debajo de la entrada de texto, el área "Seleccionar logotipo" permite una capa adicional de personalización. Los usuarios pueden cargar un logotipo que se incrustará en el código QR, mejorando el reconocimiento de la marca o personalizando el código. El cuadro de imagen adyacente proporciona una vista previa del logotipo seleccionado, ofreciendo una respuesta visual inmediata.

Configuración de color

Color de fondo

Desplazándose hacia la derecha, la interfaz presenta opciones para la selección de colores. Dos botones, uno para el color del código QR y otro para el color de fondo, permiten a los usuarios personalizar la paleta de su código QR. Los cuadros de texto enriquecido situados junto a estos botones muestran el color seleccionado actualmente.

La cuidada disposición de la sección de entrada, con sus opciones de texto, logotipo y color, refleja una clara comprensión de las prioridades del usuario a la hora de crear un código QR. Combina funcionalidad con flexibilidad, lo que permite a los usuarios introducir la información necesaria de forma rápida y eficaz, al tiempo que ofrece margen para la creatividad.

3.3 Parámetros de estilo

Estilismo

Ajustes de dimensión

Junto a las herramientas de personalización del color, los usuarios encontrarán la entrada "Dimensiones". Este ajuste numérico es fundamental, ya que dicta el tamaño total del código QR, garantizando que encaja perfectamente en el contexto de visualización previsto, ya sea una tarjeta de visita, un folleto o una pantalla digital.

Ajustes de margen

Junto a la entrada de dimensión, el campo "Márgenes" permite a los usuarios especificar el espacio en blanco que rodea al código QR. Los márgenes son algo más que una elección estética; son un elemento funcional que puede afectar a la legibilidad del código QR por parte de los escáneres. La aplicación proporciona un control numérico arriba-abajo para que los usuarios puedan ajustar este parámetro fácilmente.

3.4 Vista previa de la salida

Salida QR

Una vez que el usuario inicia la generación del código QR, el gran recuadro de la izquierda del formulario, etiquetado como "Salida", se convierte en el centro de atención. Sirve como pantalla dinámica, proporcionando una vista previa en tiempo real del código QR generado. Esta respuesta visual inmediata es esencial para que los usuarios verifiquen sus elecciones de diseño y se aseguren de que el código QR cumple sus expectativas antes de guardarlo.

3.5 Botones de acción

Generar QR

Código QR en C#

El botón "Generar QR" es un elemento de control fundamental en la interfaz de la aplicación. Situado estratégicamente dentro del formulario, este botón es el catalizador del proceso de creación del código QR. Al pulsar este botón, la aplicación toma todos los datos de entrada y parámetros de estilo definidos por el usuario y comienza la generación de un código QR personalizado.

Guardar código QR

Guardar

Una vez que se ha generado un código QR y se muestra en el área de vista previa de salida, entra en juego el botón "Guardar QR". Al hacer clic en él, se abre un cuadro de diálogo para guardar, que permite al usuario elegir el formato de archivo y la ubicación de almacenamiento deseados.

Restablecer formulario

Restablecer

Con un solo clic, este botón borra todas las entradas y selecciones anteriores, restaurando todos los ajustes a sus valores por defecto. Es un aspecto importante del formulario, ya que ofrece una forma rápida de reiniciar la aplicación sin necesidad de ajustar manualmente cada opción.

Paso 4: Escribir la lógica backend

4.1 Configuración e inicialización

En primer lugar, la aplicación comienza con la inclusión de los espacios de nombres necesarios: IronQr y IronSoftware.Drawing. Estos namespaces son esenciales ya que proporcionan las funcionalidades necesarias para generar y manipular códigos QR y colores dentro de la aplicación. La clase Color personalizada se define para facilitar la gestión del color en la generación de códigos QR, sobrescribiendo la clase System.Drawing.Color por defecto para asegurar la compatibilidad con los requisitos de IronQR.

:path=/static-assets/qr/content-code-examples/tutorials/csharp-qr-code-generator-application-4.cs
using IronQr;
using IronSoftware.Drawing;
using Color = IronSoftware.Drawing.Color;

Imports IronQr
Imports IronSoftware.Drawing
Imports Color = IronSoftware.Drawing.Color
VB   C#

El constructor de la clase QR_Generator desempeña un papel crucial en la preparación de la aplicación para su uso. Es aquí donde se inicializan los componentes de la aplicación, que es un paso estándar en las aplicaciones Windows Forms para configurar los elementos UI del formulario.

:path=/static-assets/qr/content-code-examples/tutorials/csharp-qr-code-generator-application-5.cs
public QR_Generator()
{
    InitializeComponent();
    SetLicenseKey();
    EnsureDirectoryExists(qrCodesDirectory);
}
'INSTANT VB WARNING: The following constructor is declared outside of its associated class:
'ORIGINAL LINE: public QR_Generator()
Public Sub New()
	InitializeComponent()
	SetLicenseKey()
	EnsureDirectoryExists(qrCodesDirectory)
End Sub
VB   C#

EstablecerLlaveDeLicencia: Este método es llamado para aplicar una clave de licencia válida para la librería IronQR. El uso de una clave de licencia es obligatorio para las aplicaciones comerciales y para desbloquear todas las capacidades de la biblioteca IronQR.

AsegurarDirectorioExistente: Dada la necesidad de guardar los códigos QR generados, este método asegura que existe un directorio dedicado disponible. Comprueba si el directorio "Códigos QR" existe en la ruta de inicio de la aplicación y lo crea en caso contrario.

4.2 Configuración de la clave de licencia

Para garantizar que IronQR funciona sin limitaciones, debe aplicarse una clave de licencia válida. Esto se consigue mediante el método SetLicenseKey, que es un método estático diseñado para configurar la biblioteca con su clave de licencia comprada o de prueba. El siguiente fragmento de código ilustra cómo establecer la clave de licencia:

:path=/static-assets/qr/content-code-examples/tutorials/csharp-qr-code-generator-application-6.cs
private static void SetLicenseKey()
{
    IronQr.License.LicenseKey = "YOUR_LICENSE_KEY";
}
Private Shared Sub SetLicenseKey()
	IronQr.License.LicenseKey = "YOUR_LICENSE_KEY"
End Sub
VB   C#

Sustituya "YOUR_LICENSE_KEY" por la clave de licencia real que obtuvo de Iron Software. El método se ejecuta en el constructor de la clase QR_Generator, lo que garantiza que la licencia se aplique en cuanto se inicie la aplicación y antes de que se genere ningún código QR.

4.3 Gestión de directorios

La aplicación utiliza el método EnsureDirectoryExists para comprobar si existe el directorio especificado para almacenar los códigos QR. Si no, crea el directorio. Este método toma un parámetro de cadena, que es la ruta del directorio a comprobar o crear. Así es como se aplica:

:path=/static-assets/qr/content-code-examples/tutorials/csharp-qr-code-generator-application-7.cs
private static void EnsureDirectoryExists(string path)
{
    if (!System.IO.Directory.Exists(path))
    {
        System.IO.Directory.CreateDirectory(path);
    }
}
Private Shared Sub EnsureDirectoryExists(ByVal path As String)
	If Not System.IO.Directory.Exists(path) Then
		System.IO.Directory.CreateDirectory(path)
	End If
End Sub
VB   C#

Este método utiliza el espacio de nombres System.IO para interactuar con el sistema de archivos. Primero comprueba si el directorio de la ruta especificada existe utilizando Directory.Exists. Si el directorio no existe(se devuelve false)crea el directorio utilizando Directory.CreateDirectory.

La ruta al directorio de códigos QR se define en el constructor de la clase QR_Generator como qrCodesDirectory, que combina la ruta de inicio de la aplicación con un nombre de carpeta "QR Codes":

:path=/static-assets/qr/content-code-examples/tutorials/csharp-qr-code-generator-application-8.cs
string qrCodesDirectory = System.IO.Path.Combine(Application.StartupPath, "QR Codes");
Dim qrCodesDirectory As String = System.IO.Path.Combine(Application.StartupPath, "QR Codes")
VB   C#

4.4 Selección de colores

La aplicación proporciona dos botones en la interfaz de usuario, cada uno vinculado a un método para seleccionar colores: btn_color_Click para el color del código QR y btn_background_Click para el color de fondo. Estos métodos aprovechan un cuadro de diálogo de color para que el usuario elija los colores.

Cuando se selecciona un color mediante el cuadro de diálogo de color, el color elegido se convierte a un formato de cadena hexadecimal. Esto es necesario porque la biblioteca IronQR requiere que los colores se especifiquen en formato hexadecimal. La conversión se realiza a través del método ColorToHex:

:path=/static-assets/qr/content-code-examples/tutorials/csharp-qr-code-generator-application-9.cs
private string ColorToHex(System.Drawing.Color color)
{
    return $"#{color.R:X2}{color.G:X2}{color.B:X2}";
}
Private Function ColorToHex(ByVal color As System.Drawing.Color) As String
	Return $"#{color.R:X2}{color.G:X2}{color.B:X2}"
End Function
VB   C#

El método UpdateColor toma el color seleccionado y lo convierte al formato IronSoftware.Drawing.Color utilizando la cadena hexadecimal, y actualiza el color de primer plano o de fondo del código QR dependiendo de la selección. También actualiza la interfaz de usuario para reflejar la nueva elección de color:

:path=/static-assets/qr/content-code-examples/tutorials/csharp-qr-code-generator-application-10.cs
private void UpdateColor(ref Color targetColor, Control display, bool isBackground)
{
    if (select_color.ShowDialog() == DialogResult.OK)
    {
        var hexColor = ColorToHex(select_color.Color);
        targetColor = new Color(hexColor);
        display.BackColor = select_color.Color;
    }
}
Private Sub UpdateColor(ByRef targetColor As Color, ByVal display As Control, ByVal isBackground As Boolean)
	If select_color.ShowDialog() = DialogResult.OK Then
		Dim hexColor = ColorToHex(select_color.Color)
		targetColor = New Color(hexColor)
		display.BackColor = select_color.Color
	End If
End Sub
VB   C#

4.5 Añadir logotipo

La aplicación incluye un botón(btn_logo_Click) que, al pulsarlo, abre un diálogo de archivo que permite al usuario seleccionar un archivo de imagen para utilizarlo como logotipo. Esta función es fundamental para las empresas o particulares que desean personalizar sus códigos QR. Así es como se gestiona el proceso de selección e integración del logotipo:

:path=/static-assets/qr/content-code-examples/tutorials/csharp-qr-code-generator-application-11.cs
private void btn_logo_Click(object sender, EventArgs e)
{
    if (select_logo.ShowDialog() == DialogResult.OK)
    {
        try
        {
            logoBmp = new AnyBitmap(select_logo.FileName);
            selected_logo.Image = Image.FromFile(select_logo.FileName);
        }
        catch (Exception ex)
        {
            ShowError("An error occurred while loading the logo", ex.Message);
        }
    }
}
Private Sub btn_logo_Click(ByVal sender As Object, ByVal e As EventArgs)
	If select_logo.ShowDialog() = DialogResult.OK Then
		Try
			logoBmp = New AnyBitmap(select_logo.FileName)
			selected_logo.Image = Image.FromFile(select_logo.FileName)
		Catch ex As Exception
			ShowError("An error occurred while loading the logo", ex.Message)
		End Try
	End If
End Sub
VB   C#

Al seleccionar correctamente una imagen, la aplicación intenta cargarla y mostrar una vista previa. El objeto AnyBitmap, logoBmp, se establece entonces con la imagen seleccionada, que la lógica de generación de QR utiliza posteriormente.

4.6 Generación de códigos QR

El proceso de generación comienza cuando el usuario hace clic en el botón "Generar", que está vinculado al método btn_generate_Click. Este método actúa como disparador, llamando a la función GenerateQRCode donde reside la lógica de generación real.

:path=/static-assets/qr/content-code-examples/tutorials/csharp-qr-code-generator-application-12.cs
private void btn_generate_Click(object sender, EventArgs e)
{
    GenerateQRCode();
}
Private Sub btn_generate_Click(ByVal sender As Object, ByVal e As EventArgs)
	GenerateQRCode()
End Sub
VB   C#

Dentro del método GenerateQRCode, la aplicación construye un código QR basado en los parámetros especificados, incluyendo el texto de entrada y las opciones de estilo. El método encapsula la creación de un código QR, aplicando los colores seleccionados, las dimensiones, los márgenes y, opcionalmente, un logotipo.

:path=/static-assets/qr/content-code-examples/tutorials/csharp-qr-code-generator-application-13.cs
private void GenerateQRCode()
{
    try
    {
        var options = new QrOptions(QrErrorCorrectionLevel.High);
        var myQr = QrWriter.Write(txt_QR.Text, options);
        var style = CreateStyleOptions();
        var qrImage = myQr.Save(style);
        var fileName = $"{DateTime.Now:yyyyMMddHHmmssfff}_QR.png";
        var fullPath = System.IO.Path.Combine(qrCodesDirectory, fileName);
        qrImage.SaveAs(fullPath);
        pictureBox.Image = Image.FromFile(fullPath);
    }
    catch (Exception ex)
    {
        ShowError("An error occurred during QR code generation or saving", ex.Message);
    }
}
Private Sub GenerateQRCode()
	Try
		Dim options = New QrOptions(QrErrorCorrectionLevel.High)
		Dim myQr = QrWriter.Write(txt_QR.Text, options)
		Dim style = CreateStyleOptions()
		Dim qrImage = myQr.Save(style)
		Dim fileName = $"{DateTime.Now:yyyyMMddHHmmssfff}_QR.png"
		Dim fullPath = System.IO.Path.Combine(qrCodesDirectory, fileName)
		qrImage.SaveAs(fullPath)
		pictureBox.Image = Image.FromFile(fullPath)
	Catch ex As Exception
		ShowError("An error occurred during QR code generation or saving", ex.Message)
	End Try
End Sub
VB   C#

El objeto QrOptions define el nivel de corrección de errores, mejorando la resistencia del código QR frente a daños u oscurecimiento. El método CreateStyleOptions genera un objeto QrStyleOptions, que incluye los ajustes personalizados del usuario como colores, dimensiones y el logotipo. He aquí el método en detalle:

:path=/static-assets/qr/content-code-examples/tutorials/csharp-qr-code-generator-application-14.cs
private QrStyleOptions CreateStyleOptions()
{
    return new QrStyleOptions
    {
        BackgroundColor = bgColor,
        Color = color,
        Dimensions = txt_dimension.Value > 0 ? Convert.ToInt32(txt_dimension.Value) : throw new ArgumentException("Please select valid dimensions!"),
        Margins = Convert.ToInt32(txt_margin.Value),
        Logo = logoBmp != null ? new QrLogo { Bitmap = logoBmp, Width = 50, Height = 50, CornerRadius = 5 } : null
    };
}
Private Function CreateStyleOptions() As QrStyleOptions
'INSTANT VB TODO TASK: Throw expressions are not converted by Instant VB:
'ORIGINAL LINE: return new QrStyleOptions { BackgroundColor = bgColor, Color = color, Dimensions = txt_dimension.Value > 0 ? Convert.ToInt32(txt_dimension.Value) : throw new ArgumentException("Please select valid dimensions!"), Margins = Convert.ToInt32(txt_margin.Value), Logo = logoBmp != null ? new QrLogo { Bitmap = logoBmp, Width = 50, Height = 50, CornerRadius = 5 } : null };
	Return New QrStyleOptions With {
		.BackgroundColor = bgColor,
		.Color = color,
		.Dimensions = If(txt_dimension.Value > 0, Convert.ToInt32(txt_dimension.Value), throw New ArgumentException("Please select valid dimensions!")),
		.Margins = Convert.ToInt32(txt_margin.Value),
		.Logo = If(logoBmp IsNot Nothing, New QrLogo With {
			.Bitmap = logoBmp,
			.Width = 50,
			.Height = 50,
			.CornerRadius = 5
		}, Nothing)
	}
End Function
VB   C#

Este método crea un objeto QrStyleOptions, que luego es utilizado por la lógica de generación de códigos QR para aplicar las preferencias del usuario. Las opciones incluyen:

  • BackgroundColor y Color: Estas propiedades establecen los colores de fondo y primer plano del código QR, lo que permite una apariencia personalizada que puede coincidir con la marca o las preferencias estéticas.
  • Dimensiones: Esta propiedad determina el tamaño del código QR, ofreciendo flexibilidad a la hora de encajar el código QR en diferentes contextos o soportes.
  • Márgenes: Esta propiedad establece el tamaño del margen alrededor del código QR, asegurando que esté aislado de los elementos circundantes, lo que puede ser crucial para la escalabilidad.
  • Logotipo: Si el usuario ha optado por incluir un logotipo, se configura aquí con dimensiones específicas y un radio de esquina para un aspecto pulido.

4.7 Guardar el código QR

La función de guardado se activa mediante el botón "Guardar", que está vinculado al método btn_save_Click. Este método llama a SaveQRCode, que implementa la lógica de guardado. El proceso incluye la visualización de un cuadro de diálogo para guardar el archivo, que permite al usuario elegir el formato de archivo y la ubicación para guardar el código QR.

:path=/static-assets/qr/content-code-examples/tutorials/csharp-qr-code-generator-application-15.cs
private void btn_save_Click(object sender, EventArgs e)
{
    SaveQRCode();
}

private void SaveQRCode()
{
    if (pictureBox.Image == null)
    {
        MessageBox.Show("There is no QR code to save.", "Error");
        return;
    }

    saveFileDialog.Filter = "PNG Files|*.png|JPEG Files|*.jpg";
    saveFileDialog.Title = "Save QR Code";
    saveFileDialog.FileName = "QRCode";

    if (saveFileDialog.ShowDialog() == DialogResult.OK)
    {
        try
        {
            pictureBox.Image.Save(saveFileDialog.FileName, DetermineImageFormat(saveFileDialog.FileName));
            MessageBox.Show("QR Code has been saved!", "Success");
        }
        catch (Exception ex)
        {
            ShowError("An error occurred while saving the QR code", ex.Message);
        }
    }
}
Private Sub btn_save_Click(ByVal sender As Object, ByVal e As EventArgs)
	SaveQRCode()
End Sub

Private Sub SaveQRCode()
	If pictureBox.Image Is Nothing Then
		MessageBox.Show("There is no QR code to save.", "Error")
		Return
	End If

	saveFileDialog.Filter = "PNG Files|*.png|JPEG Files|*.jpg"
	saveFileDialog.Title = "Save QR Code"
	saveFileDialog.FileName = "QRCode"

	If saveFileDialog.ShowDialog() = DialogResult.OK Then
		Try
			pictureBox.Image.Save(saveFileDialog.FileName, DetermineImageFormat(saveFileDialog.FileName))
			MessageBox.Show("QR Code has been saved!", "Success")
		Catch ex As Exception
			ShowError("An error occurred while saving the QR code", ex.Message)
		End Try
	End If
End Sub
VB   C#

Este método comprueba si hay un código QR generado disponible. Si es así, presenta al usuario opciones para guardar el archivo en formato PNG o JPEG. La función DetermineImageFormat garantiza que la imagen se guarda en el formato correcto en función de la extensión de archivo elegida por el usuario.

:path=/static-assets/qr/content-code-examples/tutorials/csharp-qr-code-generator-application-16.cs
private System.Drawing.Imaging.ImageFormat DetermineImageFormat(string filePath)
{
    return System.IO.Path.GetExtension(filePath).ToLower() == ".jpg" ? System.Drawing.Imaging.ImageFormat.Jpeg : System.Drawing.Imaging.ImageFormat.Png;
}
Private Function DetermineImageFormat(ByVal filePath As String) As System.Drawing.Imaging.ImageFormat
	Return If(System.IO.Path.GetExtension(filePath).ToLower() = ".jpg", System.Drawing.Imaging.ImageFormat.Jpeg, System.Drawing.Imaging.ImageFormat.Png)
End Function
VB   C#

Esta flexibilidad permite a los usuarios elegir el formato que mejor se adapte a sus necesidades, ya sea dando prioridad a la calidad(PNG) o el tamaño del archivo(JPEG).

4.8 Reiniciar la aplicación

La funcionalidad de reinicio está vinculada a un botón "Reiniciar", que invoca el método btn_reset_Click. Este método, a su vez, llama a ResetFields, una función diseñada para borrar todas las entradas del usuario y restaurar los valores por defecto de todos los ajustes, incluyendo los campos de texto, las selecciones de color y el logotipo seleccionado.

:path=/static-assets/qr/content-code-examples/tutorials/csharp-qr-code-generator-application-17.cs
private void btn_reset_Click(object sender, EventArgs e)
{
    ResetFields();
}

private void ResetFields()
{
    txt_QR.Text = string.Empty;
    txt_dimension.Value = 200;
    txt_margin.Value = 0;
    bgColor = Color.White;
    color = Color.Black;
    txt_selected_color.BackColor = System.Drawing.Color.White;
    txt_selected_bgcolor.BackColor = System.Drawing.Color.Black;
    logoBmp = null;
    selected_logo.Image = null;
    pictureBox.Image = null;
}
Private Sub btn_reset_Click(ByVal sender As Object, ByVal e As EventArgs)
	ResetFields()
End Sub

Private Sub ResetFields()
	txt_QR.Text = String.Empty
	txt_dimension.Value = 200
	txt_margin.Value = 0
	bgColor = Color.White
	color = Color.Black
	txt_selected_color.BackColor = System.Drawing.Color.White
	txt_selected_bgcolor.BackColor = System.Drawing.Color.Black
	logoBmp = Nothing
	selected_logo.Image = Nothing
	pictureBox.Image = Nothing
End Sub
VB   C#

Este método reinicia cada uno de los componentes que intervienen en la generación del código QR. Por ejemplo, borra el texto del código QR, establece las dimensiones y los márgenes en los valores predeterminados y elimina los colores o logotipos seleccionados.

4.9 Tratamiento de errores

La aplicación utiliza el método ShowError para mostrar los mensajes de error de forma sencilla. Este método recibe dos parámetros: un título y un mensaje, que proporcionan contexto sobre el error al usuario. Así es como se aplica:

:path=/static-assets/qr/content-code-examples/tutorials/csharp-qr-code-generator-application-18.cs
private static void ShowError(string title, string message)
{
    MessageBox.Show($"{title}: {message}", "Error");
}
Private Shared Sub ShowError(ByVal title As String, ByVal message As String)
	MessageBox.Show($"{title}: {message}", "Error")
End Sub
VB   C#

Este método se utiliza en diferentes partes de la aplicación para garantizar que, cuando se produce un error, el usuario sea informado rápidamente con un mensaje claro y conciso. Por ejemplo, si se produce un error al cargar el logotipo o durante el proceso de generación del código QR, la aplicación llama a ShowError para mostrar detalles sobre el problema.

4.10 Ejemplo de código completo

Aquí está el código completo que le ayudará a entender el código mucho más fácilmente:

:path=/static-assets/qr/content-code-examples/tutorials/csharp-qr-code-generator-application-19.cs
using IronQr;
using IronSoftware.Drawing;
using Color = IronSoftware.Drawing.Color;

namespace IronQR_QR_Generator_WinForms
{
    public partial class QR_Generator : Form
    {
        string qrCodesDirectory = System.IO.Path.Combine(Application.StartupPath, "QR Codes");
        Color bgColor = Color.White;
        Color color = Color.Black;
        AnyBitmap? logoBmp = null;

        public QR_Generator()
        {
            InitializeComponent();
            SetLicenseKey();
            EnsureDirectoryExists(qrCodesDirectory);
        }

        private static void SetLicenseKey()
        {
            IronQr.License.LicenseKey = "License-Key";
        }

        private static void EnsureDirectoryExists(string path)
        {
            if (!System.IO.Directory.Exists(path))
            {
                System.IO.Directory.CreateDirectory(path);
            }
        }

        private void btn_color_Click(object sender, EventArgs e)
        {
            UpdateColor(ref color, txt_selected_color, false);
        }

        private void btn_background_Click(object sender, EventArgs e)
        {
            UpdateColor(ref bgColor, txt_selected_bgcolor, true);
        }

        private string ColorToHex(System.Drawing.Color color)
        {
            return $"#{color.R:X2}{color.G:X2}{color.B:X2}";
        }
        private void UpdateColor(ref Color targetColor, Control display, bool isBackground)
        {
            if (select_color.ShowDialog() == DialogResult.OK)
            {

                var hexColor = ColorToHex(select_color.Color);
                targetColor = new Color(hexColor);
                display.BackColor = select_color.Color;
            }
        }

        private void btn_logo_Click(object sender, EventArgs e)
        {
            if (select_logo.ShowDialog() == DialogResult.OK)
            {
                try
                {
                    logoBmp = new AnyBitmap(select_logo.FileName);
                    selected_logo.Image = Image.FromFile(select_logo.FileName);
                }
                catch (Exception ex)
                {
                    ShowError("An error occurred while loading the logo", ex.Message);
                }
            }
        }

        private void btn_generate_Click(object sender, EventArgs e)
        {
            GenerateQRCode();
        }

        private void GenerateQRCode()
        {
            try
            {
                var options = new QrOptions(QrErrorCorrectionLevel.High);
                var myQr = QrWriter.Write(txt_QR.Text, options);
                var style = CreateStyleOptions();
                var qrImage = myQr.Save(style);
                var fileName = $"{DateTime.Now:yyyyMMddHHmmssfff}_QR.png";
                var fullPath = System.IO.Path.Combine(qrCodesDirectory, fileName);
                qrImage.SaveAs(fullPath);
                pictureBox.Image = Image.FromFile(fullPath);
            }
            catch (Exception ex)
            {
                ShowError("An error occurred during QR code generation or saving", ex.Message);
            }
        }

        private QrStyleOptions CreateStyleOptions()
        {
            return new QrStyleOptions
            {
                BackgroundColor = bgColor,
                Color = color,
                Dimensions = txt_dimension.Value > 0 ? Convert.ToInt32(txt_dimension.Value) : throw new ArgumentException("Please select valid dimensions!"),
                Margins = Convert.ToInt32(txt_margin.Value),
                Logo = logoBmp != null ? new QrLogo { Bitmap = logoBmp, Width = 50, Height = 50, CornerRadius = 5 } : null
            };
        }

        private void btn_save_Click(object sender, EventArgs e)
        {
            SaveQRCode();
        }

        private void SaveQRCode()
        {
            if (pictureBox.Image == null)
            {
                MessageBox.Show("There is no QR code to save.", "Error");
                return;
            }

            saveFileDialog.Filter = "PNG Files|*.png|JPEG Files|*.jpg";
            saveFileDialog.Title = "Save QR Code";
            saveFileDialog.FileName = "QRCode";

            if (saveFileDialog.ShowDialog() == DialogResult.OK)
            {
                try
                {
                    pictureBox.Image.Save(saveFileDialog.FileName, DetermineImageFormat(saveFileDialog.FileName));
                    MessageBox.Show("QR Code has been saved!", "Success");
                }
                catch (Exception ex)
                {
                    ShowError("An error occurred while saving the QR code", ex.Message);
                }
            }
        }

        private System.Drawing.Imaging.ImageFormat DetermineImageFormat(string filePath)
        {
            return System.IO.Path.GetExtension(filePath).ToLower() == ".jpg" ? System.Drawing.Imaging.ImageFormat.Jpeg : System.Drawing.Imaging.ImageFormat.Png;
        }

        private void btn_reset_Click(object sender, EventArgs e)
        {
            ResetFields();
        }

        private void ResetFields()
        {
            txt_QR.Text = string.Empty;
            txt_dimension.Value = 200;
            txt_margin.Value = 0;
            bgColor = Color.White;
            color = Color.Black;
            txt_selected_color.BackColor = bgColor;
            txt_selected_bgcolor.BackColor = color;
            logoBmp = null;
            selected_logo.Image = null;
            pictureBox.Image = null;
        }

        private static void ShowError(string title, string message)
        {
            MessageBox.Show($"{title}: {message}", "Error");
        }
    }
}
Imports IronQr
Imports IronSoftware.Drawing
Imports Color = IronSoftware.Drawing.Color

Namespace IronQR_QR_Generator_WinForms
	Partial Public Class QR_Generator
		Inherits Form

		Private qrCodesDirectory As String = System.IO.Path.Combine(Application.StartupPath, "QR Codes")
		Private bgColor As Color = Color.White
		Private color As Color = Color.Black
		Private logoBmp? As AnyBitmap = Nothing

		Public Sub New()
			InitializeComponent()
			SetLicenseKey()
			EnsureDirectoryExists(qrCodesDirectory)
		End Sub

		Private Shared Sub SetLicenseKey()
			IronQr.License.LicenseKey = "License-Key"
		End Sub

		Private Shared Sub EnsureDirectoryExists(ByVal path As String)
			If Not System.IO.Directory.Exists(path) Then
				System.IO.Directory.CreateDirectory(path)
			End If
		End Sub

		Private Sub btn_color_Click(ByVal sender As Object, ByVal e As EventArgs)
			UpdateColor(color, txt_selected_color, False)
		End Sub

		Private Sub btn_background_Click(ByVal sender As Object, ByVal e As EventArgs)
			UpdateColor(bgColor, txt_selected_bgcolor, True)
		End Sub

		Private Function ColorToHex(ByVal color As System.Drawing.Color) As String
			Return $"#{color.R:X2}{color.G:X2}{color.B:X2}"
		End Function
		Private Sub UpdateColor(ByRef targetColor As Color, ByVal display As Control, ByVal isBackground As Boolean)
			If select_color.ShowDialog() = System.Windows.Forms.DialogResult.OK Then

				Dim hexColor = ColorToHex(select_color.Color)
				targetColor = New Color(hexColor)
				display.BackColor = select_color.Color
			End If
		End Sub

		Private Sub btn_logo_Click(ByVal sender As Object, ByVal e As EventArgs)
			If select_logo.ShowDialog() = System.Windows.Forms.DialogResult.OK Then
				Try
					logoBmp = New AnyBitmap(select_logo.FileName)
					selected_logo.Image = Image.FromFile(select_logo.FileName)
				Catch ex As Exception
					ShowError("An error occurred while loading the logo", ex.Message)
				End Try
			End If
		End Sub

		Private Sub btn_generate_Click(ByVal sender As Object, ByVal e As EventArgs)
			GenerateQRCode()
		End Sub

		Private Sub GenerateQRCode()
			Try
				Dim options = New QrOptions(QrErrorCorrectionLevel.High)
				Dim myQr = QrWriter.Write(txt_QR.Text, options)
				Dim style = CreateStyleOptions()
				Dim qrImage = myQr.Save(style)
				Dim fileName = $"{DateTime.Now:yyyyMMddHHmmssfff}_QR.png"
				Dim fullPath = System.IO.Path.Combine(qrCodesDirectory, fileName)
				qrImage.SaveAs(fullPath)
				pictureBox.Image = Image.FromFile(fullPath)
			Catch ex As Exception
				ShowError("An error occurred during QR code generation or saving", ex.Message)
			End Try
		End Sub

		Private Function CreateStyleOptions() As QrStyleOptions
'INSTANT VB TODO TASK: Throw expressions are not converted by Instant VB:
'ORIGINAL LINE: return new QrStyleOptions { BackgroundColor = bgColor, Color = color, Dimensions = txt_dimension.Value > 0 ? Convert.ToInt32(txt_dimension.Value) : throw new ArgumentException("Please select valid dimensions!"), Margins = Convert.ToInt32(txt_margin.Value), Logo = logoBmp != null ? new QrLogo { Bitmap = logoBmp, Width = 50, Height = 50, CornerRadius = 5 } : null };
			Return New QrStyleOptions With {
				.BackgroundColor = bgColor,
				.Color = color,
				.Dimensions = If(txt_dimension.Value > 0, Convert.ToInt32(txt_dimension.Value), throw New ArgumentException("Please select valid dimensions!")),
				.Margins = Convert.ToInt32(txt_margin.Value),
				.Logo = If(logoBmp IsNot Nothing, New QrLogo With {
					.Bitmap = logoBmp,
					.Width = 50,
					.Height = 50,
					.CornerRadius = 5
				}, Nothing)
			}
		End Function

		Private Sub btn_save_Click(ByVal sender As Object, ByVal e As EventArgs)
			SaveQRCode()
		End Sub

		Private Sub SaveQRCode()
			If pictureBox.Image Is Nothing Then
				MessageBox.Show("There is no QR code to save.", "Error")
				Return
			End If

			saveFileDialog.Filter = "PNG Files|*.png|JPEG Files|*.jpg"
			saveFileDialog.Title = "Save QR Code"
			saveFileDialog.FileName = "QRCode"

			If saveFileDialog.ShowDialog() = System.Windows.Forms.DialogResult.OK Then
				Try
					pictureBox.Image.Save(saveFileDialog.FileName, DetermineImageFormat(saveFileDialog.FileName))
					MessageBox.Show("QR Code has been saved!", "Success")
				Catch ex As Exception
					ShowError("An error occurred while saving the QR code", ex.Message)
				End Try
			End If
		End Sub

		Private Function DetermineImageFormat(ByVal filePath As String) As System.Drawing.Imaging.ImageFormat
			Return If(System.IO.Path.GetExtension(filePath).ToLower() = ".jpg", System.Drawing.Imaging.ImageFormat.Jpeg, System.Drawing.Imaging.ImageFormat.Png)
		End Function

		Private Sub btn_reset_Click(ByVal sender As Object, ByVal e As EventArgs)
			ResetFields()
		End Sub

		Private Sub ResetFields()
			txt_QR.Text = String.Empty
			txt_dimension.Value = 200
			txt_margin.Value = 0
			bgColor = Color.White
			color = Color.Black
			txt_selected_color.BackColor = bgColor
			txt_selected_bgcolor.BackColor = color
			logoBmp = Nothing
			selected_logo.Image = Nothing
			pictureBox.Image = Nothing
		End Sub

		Private Shared Sub ShowError(ByVal title As String, ByVal message As String)
			MessageBox.Show($"{title}: {message}", "Error")
		End Sub
	End Class
End Namespace
VB   C#

Paso 5: Ejecutar la aplicación

Cuando se ejecuta la aplicación, aparece la ventana principal tal y como se muestra en la imagen proporcionada. El diseño está perfectamente organizado en secciones de entrada, estilo, salida y acciones.

Salida de aplicaciones

El primer paso del proceso consiste en introducir datos en el campo "Introducir texto QR". Estos datos formarán el contenido del código QR, como una URL o información textual. A continuación, para personalizar el código QR, seleccionamos un logotipo haciendo clic en el botón "Seleccionar logotipo". Al seleccionarlo, el logotipo se coloca visiblemente en el cuadro de vista previa adyacente al botón, confirmando su incorporación al diseño del código QR.

Logotipo

Tras la selección del logotipo, elegimos los colores de primer plano y fondo del código QR. Tras pulsar los respectivos botones, los colores elegidos se reflejan en los cuadros de visualización de colores situados junto a cada botón, lo que nos ofrece una confirmación visual inmediata de nuestras elecciones.

Selector de color

Para este código QR en concreto, fijamos las dimensiones en 500, asegurándonos de que el código tiene un tamaño adecuado a nuestras necesidades, y ajustamos los márgenes a 20, lo que proporciona un búfer alrededor del código QR para evitar problemas de escaneado.

Dimensiones

Con todas las entradas y opciones de estilo configuradas, procedemos a generar el código QR pulsando el botón "Generar QR". La aplicación procesa nuestras entradas y muestra el código QR recién creado en el cuadro de imagen de salida.

Lectura de códigos QR Salida

Para guardar el código QR generado, basta con hacer clic en el botón "Guardar QR". Esta acción abre un cuadro de diálogo para guardar, que nos permite elegir el destino y el formato de archivo para nuestra imagen de código QR.

Diálogo Guardar

Una vez guardado, un mensaje de éxito confirma que el código QR se ha almacenado correctamente.

Mensaje de éxito

Si necesitamos empezar de nuevo o crear un nuevo código QR, al hacer clic en el botón "Restablecer formulario" el formulario vuelve a su estado original, borrando todos los campos y selecciones, listo para la siguiente generación de códigos QR.

Restablecer formulario

Aquí está el código QR guardado generado por IronQR:

Salida de código QR

Conclusión

En conclusión, esta guía le ha guiado a través del proceso de generación de códigos QR utilizando la librería IronQR en una aplicación C#. Al desglosar los pasos desde la configuración de su proyecto en Visual Studio, la integración de la biblioteca IronQR, el diseño de una interfaz fácil de usar y la escritura de la lógica backend, hemos demostrado lo accesible que es añadir funcionalidad de código QR a sus aplicaciones.

Para aquellos interesados en explorar más a fondo las capacidades de IronQR, vale la pena señalar que IronQR ofrece un prueba gratuita para empezar. Si decide integrar IronQR en sus proyectos, las licencias comienzan en $749, proporcionando una solución rentable para la generación de códigos QR de nivel profesional.