USO DE IRONQR

Cómo crear una aplicación generadora de códigos QR en C#

Publicado en 20 de mayo, 2024
Compartir:

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.

Cómo crear un generador de código QR en C#

  1. Crear una aplicación Windows Forms en Visual Studio

  2. Instalación de la biblioteca QR con NuGet

  3. Diseñar los elementos frontales del formulario

  4. Escribe la lógica de generación de QR5. Ejecutar la aplicación y empezar a crear códigos QR

IronQR: C# Biblioteca QR

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.

using IronQr;
using IronSoftware.Drawing;
using Color = IronSoftware.Drawing.Color;
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
}
using IronQr;
using IronSoftware.Drawing;
using Color = IronSoftware.Drawing.Color;
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
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
VB   C#

Utilizamos el siguiente QR para escanear:

Cómo crear una aplicación generadora de códigos QR en C#: Figura 1 - Código QR Archivo de Imagen PNG

Y obtenemos este resultado:

Cómo crear una aplicación generadora de códigos QR en C#: Figura 2 - Salida de lectura de código QR

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

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 instancia y se utiliza 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, al 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.

Otro 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.

using IronQr;
using IronQr.Enum;
using IronSoftware.Drawing;
using Color = IronSoftware.Drawing.Color;
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);
using IronQr;
using IronQr.Enum;
using IronSoftware.Drawing;
using Color = IronSoftware.Drawing.Color;
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 Color = IronSoftware.Drawing.Color
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.

using IronQr;
using IronQr.Enum;
using IronSoftware.Drawing;
using Color = IronSoftware.Drawing.Color;
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}");
    }
}
using IronQr;
using IronQr.Enum;
using IronSoftware.Drawing;
using Color = IronSoftware.Drawing.Color;
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 IronQr.Enum
Imports IronSoftware.Drawing
Imports Color = IronSoftware.Drawing.Color
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ómo crear una aplicación generadora de códigos QR en C#: Figura 3 - Escanear salida de código QR

Utilizamos el siguiente código QR:

Cómo crear una aplicación generadora de códigos QR en C#: Figura 4 - Entrada 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 `Points).

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.

    Cómo crear una aplicación generadora de códigos QR en C#: Figura 5 - Windows Forms App

  • 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.

    Cómo Crear una Aplicación Generadora de Códigos QR en C#: Figura 6 - 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.

    Cómo crear una aplicación generadora de códigos QR en C#: Figura 7 - Administrar paquetes NuGet

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

    Cómo crear una aplicación generadora de códigos QR en C#: Figura 8 - Instalar IronQR

Instalación mediante la consola del gestor de paquetes NuGet

  • Vaya a Herramientas > Administrador de Paquetes NuGet > Consola del Administrador de Paquetes.

    Cómo crear una aplicación generadora de códigos QR en C#: Figura 9 - Gestor de paquetes NuGet

  • Escriba Install-Package IronQR y pulse Intro.

    Cómo crear una aplicación generadora de códigos QR en C#: Figura 10 - Instalar IronQR

Paso 3: Diseño de la interfaz

Cómo crear una aplicación generadora de códigos QR en C#: Figura 11 - Generador de código QR

3.1 Encabezado del título

Cómo Crear una Aplicación Generadora de Códigos QR en C#: Figura 12 - 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ómo crear una aplicación generadora de códigos QR en C#: Figura 13 - 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

Cómo crear una aplicación generadora de códigos QR en C#: Figura 14 - 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

Cómo crear una aplicación generadora de códigos QR en C#: Figura 15 - 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

Cómo crear una aplicación generadora de códigos QR en C#: Figura 16 - Estilo

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

Cómo crear una aplicación generadora de códigos QR en C#: Figura 17 - 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ómo crear una aplicación generadora de códigos QR en C#: Figura 18 - 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

Cómo crear una aplicación generadora de códigos QR en C#: Figura 19 - 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

Cómo crear una aplicación generadora de códigos QR en C#: Figura 20 - Reiniciar

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 e 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 personalizada Color se define para facilitar la gestión del color en la generación de códigos QR, sobrescribiendo la clase por defecto System.Drawing.Color para asegurar la compatibilidad con los requisitos de IronQR.

using IronQr;
using IronSoftware.Drawing;
using Color = IronSoftware.Drawing.Color;
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.

public QR_Generator()
{
    InitializeComponent();
    SetLicenseKey();
    EnsureDirectoryExists(qrCodesDirectory);
}
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#

SetLicenseKey: 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.

AsegurarDirectorioExiste: Dada la necesidad de guardar los códigos QR generados, este método asegura que hay 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:

private static void SetLicenseKey()
{
    IronQr.License.LicenseKey = "YOUR_LICENSE_KEY";
}
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 string, que es la ruta del directorio a comprobar o crear. Así es como se aplica:

private static void EnsureDirectoryExists(string path)
{
    if (!System.IO.Directory.Exists(path))
    {
        System.IO.Directory.CreateDirectory(path);
    }
}
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 utilizandoDirectory.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":

string qrCodesDirectory = System.IO.Path.Combine(Application.StartupPath, "QR Codes");
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:

private string ColorToHex(System.Drawing.Color color)
{
    return $"#{color.R:X2}{color.G:X2}{color.B:X2}";
}
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:

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 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(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:

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_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.

private void btn_generate_Click(object sender, EventArgs e)
{
    GenerateQRCode();
}
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.

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 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:

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 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 las preferencias de marca o estéticas.
  • **Dimensiones: Esta propiedad determina el tamaño del código QR, ofreciendo flexibilidad en cómo el código QR encaja dentro de diferentes contextos o medios.
  • Margins: 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 guardar 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.

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 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.

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 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.

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 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 mensajes de error de una manera fácil de usar. 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:

private static void ShowError(string title, string message)
{
    MessageBox.Show($"{title}: {message}", "Error");
}
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:

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");
        }
    }
}
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.

Cómo crear una aplicación generadora de códigos QR en C#: Figura 21 - Salida de la aplicación

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.

Cómo crear una aplicación generadora de códigos QR en C#: Figura 22 - 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.

Cómo crear una aplicación generadora de códigos QR en C#: Figura 23 - Selección 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.

Cómo crear una aplicación generadora de códigos QR en C#: Figura 24 - 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.

Cómo crear una aplicación generadora de códigos QR en C#: Figura 25 - 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.

Cómo crear una aplicación generadora de códigos QR en C#: Figura 26 - Diálogo Guardar

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

Cómo crear una aplicación generadora de códigos QR en C#: Figura 27 - 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.

Cómo crear una aplicación generadora de códigos QR en C#: Figura 28 - Formulario de reinicio

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

Cómo crear una aplicación generadora de códigos QR en C#: Figura 29 - 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 unprueba 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.

< ANTERIOR
Cómo leer códigos QR en C#
SIGUIENTE >
Cómo generar código QR utilizando QRCoder comparar a IronQR en .NET 6

¿Listo para empezar? Versión: 2024.12 acaba de salir

Descarga gratuita de NuGet Descargas totales: 22,660 Ver licencias >