C# Aplicación generadora de códigos QR
Bienvenido a nuestra guía para crear Có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 utilizando IronQR, 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.
Cómo crear un generador de códigos QR en C#
- Crear una aplicación Windows Forms en Visual Studio
- Instalación de la biblioteca QR con NuGet
- Diseñar los elementos frontales del formulario
- Lógica de escritura de la generación de QR
- Ejecuta la aplicación y empieza a crear códigos QR
Instalar biblioteca generadora de códigos QR en C#
Instalar con NuGet
Install-Package IronQR
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 de leer códigos QR y generar 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
Utilizamos el siguiente QR para escanear:
![C# Crear Imagen de Código QR](/static-assets/qr/tutorials/csharp-qr-code-generator-application/qr-code.webp)
Y obtenemos este resultado:
![C# Valor QR](/static-assets/qr/tutorials/csharp-qr-code-generator-application/qr-code-value.webp)
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)
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
Esta es la salida cuando escaneamos el código QR usando IronQR:
![C# Leer Código QR Resultado](/static-assets/qr/tutorials/csharp-qr-code-generator-application/qr-code-read-result.webp)
Utilizamos el siguiente código QR:
![C# Crear Imagen de Código QR](/static-assets/qr/tutorials/csharp-qr-code-generator-application/qr-code.webp)
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.
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.
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.
Busque IronQR en la lista y haga clic en Instalar junto a él.
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](/static-assets/qr/tutorials/csharp-qr-code-generator-application/nuget-package-manager.webp)
Escriba Install-Package IronQR y pulse Intro.
![Instalar IronQR](/static-assets/qr/tutorials/csharp-qr-code-generator-application/install-ironqr-via-pm.webp)
Paso 3: Diseño de la interfaz
![Generador de códigos QR](/static-assets/qr/tutorials/csharp-qr-code-generator-application/qr-code-generator.webp)
3.1 Encabezado del título
![Generar un código QR](/static-assets/qr/tutorials/csharp-qr-code-generator-application/generate-qr-code.webp)
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](/static-assets/qr/tutorials/csharp-qr-code-generator-application/qr-code-text-input.webp)
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](/static-assets/qr/tutorials/csharp-qr-code-generator-application/select-logo.webp)
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](/static-assets/qr/tutorials/csharp-qr-code-generator-application/background-color.webp)
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](/static-assets/qr/tutorials/csharp-qr-code-generator-application/styling.webp)
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](/static-assets/qr/tutorials/csharp-qr-code-generator-application/qr-output.webp)
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#](/static-assets/qr/tutorials/csharp-qr-code-generator-application/qr-code-in-csharp.webp)
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](/static-assets/qr/tutorials/csharp-qr-code-generator-application/save.webp)
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](/static-assets/qr/tutorials/csharp-qr-code-generator-application/reset.webp)
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
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
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
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
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")
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
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
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
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
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
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
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
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
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
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
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
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](/static-assets/qr/tutorials/csharp-qr-code-generator-application/application-output.webp)
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](/static-assets/qr/tutorials/csharp-qr-code-generator-application/logo.webp)
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](/static-assets/qr/tutorials/csharp-qr-code-generator-application/color-selection.webp)
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](/static-assets/qr/tutorials/csharp-qr-code-generator-application/dimensions.webp)
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](/static-assets/qr/tutorials/csharp-qr-code-generator-application/reading-qr-code-output.webp)
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](/static-assets/qr/tutorials/csharp-qr-code-generator-application/save-dialog.webp)
Una vez guardado, un mensaje de éxito confirma que el código QR se ha almacenado correctamente.
![Mensaje de éxito](/static-assets/qr/tutorials/csharp-qr-code-generator-application/success-message.webp)
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](/static-assets/qr/tutorials/csharp-qr-code-generator-application/reset-form.webp)
Aquí está el código QR guardado generado por IronQR:
![Salida de código QR](/static-assets/qr/tutorials/csharp-qr-code-generator-application/qr-code-output.webp)
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 $599, proporcionando una solución rentable para la generación de códigos QR de nivel profesional.