Saltar al pie de página
USANDO IRONQR

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

¡Bienvenido a nuestra guía sobre la creación de códigos QR utilizando C#! Los códigos QR y el .NET barcode DLL se han convertido en formas populares para compartir información de manera rápida y eficiente. Ya sea que esté desarrollando una aplicación, administrando un sitio web, o buscando una manera ingeniosa de compartir enlaces, estos códigos pueden ser increíblemente útiles. En esta guía, demostraremos cómo generar códigos QR de manera eficiente usando IronQR, asegurándonos de que pueda generar un código QR adaptado a sus necesidades. Esta biblioteca facilita a cualquier persona que trabaje con C# crear códigos QR sin entrar en una lógica compleja. Le guiaremos por los pasos, asegurándonos de que tenga todo lo que necesita para comenzar. Ya sea que esté buscando añadir la funcionalidad de generador de códigos QR a su aplicación o simplemente curioso sobre cómo se hace, está en el lugar correcto. Empecemos.

Cómo crear un generador de códigos QR en C

  1. Cree una aplicación Windows Forms en Visual Studio
  2. Instale la biblioteca QR usando NuGet
  3. Diseñe los elementos de la interfaz del formulario
  4. Escriba la lógica de generación de QR
  5. Ejecute la aplicación y comience a crear códigos QR

IronQR: Biblioteca QR de 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 y más, asegurando compatibilidad con diversos entornos de desarrollo como Windows, Linux, macOS, iOS y Android.

IronQR se distingue por sus características avanzadas, incluyendo la capacidad de leer códigos QR y generar códigos QR, soporte para múltiples formatos de imagen, y opciones de personalización como redimensionar, estilizar y agregar logos a los códigos QR.

Algunas características clave de IronQR

IronQR extiende su funcionalidad más allá de la generación básica de códigos QR, ofreciendo varias características diseñadas para acomodar una amplia gama de tareas relacionadas con códigos QR. Vamos a revisar estas características y verificar sus códigos de ejemplo, que podrá integrar en cualquier tipo de plantilla de aplicación .NET como una aplicación de consola.

Leer códigos QR

IronQR se destaca en decodificación de códigos QR, proporcionando a los usuarios una manera sencilla de acceder a la información incrustada en los códigos QR. Puede extraer datos rápida y precisamente de los códigos QR, desde URLs simples hasta información incrustada compleja.

using IronQr;
using IronSoftware.Drawing;
using Color = IronSoftware.Drawing.Color;

// Set the license key for IronQR
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);

// Print the value of each QR code found in the image
foreach (var result in qrResults)
{
    Console.WriteLine(result.Value);
}
using IronQr;
using IronSoftware.Drawing;
using Color = IronSoftware.Drawing.Color;

// Set the license key for IronQR
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);

// Print the value of each QR code found in the image
foreach (var result in qrResults)
{
    Console.WriteLine(result.Value);
}
Imports IronQr
Imports IronSoftware.Drawing
Imports Color = IronSoftware.Drawing.Color

' Set the license key for IronQR
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)

' Print the value of each QR code found in the image
For Each result In qrResults
	Console.WriteLine(result.Value)
Next result
$vbLabelText   $csharpLabel

Usamos el siguiente QR para escanear:

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

Y obtuvimos este resultado:

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

El proceso comienza incorporando los espacios de nombres necesarios, IronQr, y Iron Software.Drawing, con una mención específica de Color del espacio de nombres Iron Software.Drawing para manejar manipulaciones de 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. El código luego procede a cargar la imagen del código QR desde un archivo usando AnyBitmap.FromFile("QRCode.png").

Con la imagen cargada, el siguiente paso involucra prepararla para la detección de códigos QR. Esta preparación se realiza creando un objeto QrImageInput, que sirve como contenedor para la imagen.

El núcleo de esta característica radica en la clase QrReader, que se instancia y utiliza para realizar la operación de lectura de códigos 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 representando 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 usando un bucle foreach. Cada objeto QrResult contiene propiedades como el valor del código QR, al que se puede acceder y mostrar.

Opciones de modo de lectura de QR personalizado

IronQR le ofrece diferentes maneras de leer códigos QR de imágenes, haciéndolo versátil para diversas necesidades. Una opción es el Modo de Escaneo Mixto, que equilibra velocidad y precisión, útil cuando los códigos QR no están claros o están parcialmente ocultos.

Otra es el Modo de Escaneo por Aprendizaje Automático (ML), que utiliza tecnología inteligente para leer códigos QR que están dañados o no son fáciles de leer normalmente. Este modo es excelente para situaciones difíciles donde 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 mejor cuando se necesitan 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;

// Set the license key for IronQR
IronQr.License.LicenseKey = "License-Key";

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

// Using mixed scan mode
QrImageInput mixedScanInput = new QrImageInput(inputImage, QrScanMode.OnlyDetectionModel);
IEnumerable<QrResult> mixedScanResults = new QrReader().Read(mixedScanInput);

// Using machine learning scan mode
QrImageInput mlScanInput = new QrImageInput(inputImage, QrScanMode.OnlyDetectionModel);
IEnumerable<QrResult> mlScanResults = new QrReader().Read(mlScanInput);

// Using basic scan mode
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;

// Set the license key for IronQR
IronQr.License.LicenseKey = "License-Key";

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

// Using mixed scan mode
QrImageInput mixedScanInput = new QrImageInput(inputImage, QrScanMode.OnlyDetectionModel);
IEnumerable<QrResult> mixedScanResults = new QrReader().Read(mixedScanInput);

// Using machine learning scan mode
QrImageInput mlScanInput = new QrImageInput(inputImage, QrScanMode.OnlyDetectionModel);
IEnumerable<QrResult> mlScanResults = new QrReader().Read(mlScanInput);

// Using basic scan mode
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

' Set the license key for IronQR
IronQr.License.LicenseKey = "License-Key"

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

' Using mixed scan mode
Dim mixedScanInput As New QrImageInput(inputImage, QrScanMode.OnlyDetectionModel)
Dim mixedScanResults As IEnumerable(Of QrResult) = (New QrReader()).Read(mixedScanInput)

' Using machine learning scan mode
Dim mlScanInput As New QrImageInput(inputImage, QrScanMode.OnlyDetectionModel)
Dim mlScanResults As IEnumerable(Of QrResult) = (New QrReader()).Read(mlScanInput)

' Using basic scan mode
Dim basicScanInput As New QrImageInput(inputImage, QrScanMode.OnlyBasicScan)
Dim basicScanResults As IEnumerable(Of QrResult) = (New QrReader()).Read(basicScanInput)
$vbLabelText   $csharpLabel

Leer códigos QR avanzados

Las capacidades avanzadas de lectura de códigos QR de IronQR están diseñadas para ofrecer un enfoque completo y matizado para el escaneo y decodificación de códigos QR. Este conjunto de características se extiende 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;

// Set the license key for IronQR
IronQr.License.LicenseKey = "License-Key";

// Load the image to scan
var imageToScan = AnyBitmap.FromFile("QRCode.png");

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

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

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

// Print the value, URL, and coordinates of each QR code found in the image
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;

// Set the license key for IronQR
IronQr.License.LicenseKey = "License-Key";

// Load the image to scan
var imageToScan = AnyBitmap.FromFile("QRCode.png");

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

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

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

// Print the value, URL, and coordinates of each QR code found in the image
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

' Set the license key for IronQR
IronQr.License.LicenseKey = "License-Key"

' Load the image to scan
Dim imageToScan = AnyBitmap.FromFile("QRCode.png")

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

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

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

' Print the value, URL, and coordinates of each QR code found in the image
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
$vbLabelText   $csharpLabel

Este es el resultado cuando escaneamos el código QR usando IronQR:

Cómo crear una aplicación generadora de códigos QR en C#: Figura 3 - Resultado de escaneo del código QR

Usamos 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 decodificados (Value), cualquier URL incrustada (Url), y las coordenadas espaciales (Points) del código QR dentro de la imagen.

Para cada código QR detectado, IronQR ofrece información detallada, incluyendo el contenido exacto y cualquier URL contenida dentro del 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 usando la biblioteca IronQR de códigos QR en una aplicación en C#, siga estos pasos con cuidado. Esta guía lo llevará a través de la configuración de una aplicación en formulario de Windows, la instalación de la biblioteca IronQR, la escritura del código para generar un código QR y la comprensión del resultado.

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

  • Comience iniciando Visual Studio en su computadora.
  • Haga clic en el botón "Crear un Nuevo Proyecto".
  • Seleccione Aplicación Windows Forms como el tipo de proyecto. Asegúrese de elegir C# como el idioma.

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

  • Ingrese un nombre para su proyecto y seleccione la ubicación para guardarlo. Luego, en la siguiente pantalla, seleccione .NET framework. Luego haga clic en Crear.

Cómo crear una aplicación generadora de códigos QR en C#: Figura 6 - Configuración del proyecto

Se creará y abrirá una aplicación de formularios de Windows en Visual Studio.

Paso 2: Instalar la biblioteca IronQR

Ahora es el momento de instalar la biblioteca IronQR en el proyecto. Puede instalar la biblioteca IronQR a través de diferentes métodos. Elija uno que se ajuste a su preferencia:

Instalar mediante el Administrador de paquetes NuGet

  • Haga clic derecho en su proyecto en el Explorador de Soluciones y seleccione Administrar Paquetes NuGet.
  • Escriba IronQR en el cuadro de búsqueda y presione Enter.

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

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

Instalar mediante la consola del administrador 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 - Administrador de Paquetes NuGet

  • Escriba Install-Package IronQR y presione Enter.

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

Paso 3: Diseño del frontend

Cómo crear una aplicación generadora de códigos QR en C#: Figura 11 - Generador de códigos 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 Generador de Códigos QR, los usuarios son presentados inmediatamente con un encabezado llamativo titulado "Generador de QR IronQR", establecido en una fuente audaz y autoritaria. La fuente, Agency FB, es seleccionada por sus líneas limpias y modernas, que transmiten una sensación de eficiencia y precisión. Con un tamaño de fuente de 48 puntos, el título es tanto prominente como contundente, capturando la atención del usuario y estableciendo firmemente la identidad de la aplicación.

3.2 Sección de entrada

Entrada de texto para código QR

Cómo crear una aplicación generadora de códigos QR en C#: Figura 13 - Entrada de Texto del Código QR

En el corazón de la sección de entrada reside un componente simple pero fundamental: el cuadro de entrada de texto. Aquí, los usuarios pueden ingresar los datos que desean codificar en su código QR. El cuadro es espacioso, acomodando una cantidad significativa de texto, y está posicionado prominentemente cerca de la parte superior.

Selección de logotipo

Cómo crear una aplicación generadora de códigos QR en C#: Figura 14 - Selecciona Logo

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

Configuración de color

Cómo crear una aplicación generadora de códigos QR en C#: Figura 15 - Color de Fondo

Moviéndose a la derecha, la interfaz presenta opciones para la selección de color. 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 junto a estos botones muestran el color actualmente seleccionado.

El diseño cuidadoso de la sección de entrada, con sus opciones de texto, logo y color, refleja una clara comprensión de las prioridades del usuario al crear un código QR. Combina funcionalidad con flexibilidad, permitiendo a los usuarios ingresar de manera rápida y eficiente la información necesaria mientras también ofrece espacio 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

Configuración de dimensiones

Adyacente a las herramientas de personalización de color, los usuarios encontrarán la entrada para "Dimensiones". Esta configuración numérica es crítica ya que determina el tamaño general del código QR, asegurando que se ajuste perfectamente dentro del contexto de visualización previsto, ya sea una tarjeta de presentación, un volante o una pantalla digital.

Configuración de márgenes

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

3.4 Vista previa de salida

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

Una vez que el usuario inicia la generación del código QR, el cuadro grande de imagen en el lado izquierdo del formulario, etiquetado como "Salida", se convierte en el punto focal. Sirve como una pantalla dinámica, proporcionando una vista previa en tiempo real del código QR generado. Esta retroalimentación visual inmediata es esencial para que los usuarios verifiquen sus elecciones de diseño y aseguren que el código QR cumple con 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 esencial en la interfaz de la aplicación. Posicionada estratégicamente dentro del formulario, este botón es el catalizador para el proceso de creación del código QR. Al hacer clic en este botón, la aplicación toma todos los datos de entrada y los 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, el botón "Guardar QR" entra en juego. Al hacer clic, se abre un cuadro de diálogo de guardar, permitiendo al usuario elegir el formato de archivo deseado y la ubicación de guardado.

Restablecer formulario

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

Con un solo clic, este botón limpia todas las entradas y selecciones previas, restaurando todos los ajustes a sus valores predeterminados. Es un aspecto importante del formulario, ofreciendo una manera rápida de reinicializar la aplicación sin ajustar manualmente cada opción.

Paso 4: Escribir la lógica del backend

4.1 Configuración e inicialización

Primero, la aplicación comienza con la inclusión de los espacios de nombres necesarios: IronQr y Iron Software.Drawing. Estos espacios de nombres 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 default 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
$vbLabelText   $csharpLabel

El constructor de la clase QR_Generator juega un papel crucial en preparar la aplicación para su uso. Es aquí donde se inicializan los componentes de la aplicación, lo cual es un paso estándar en las aplicaciones Windows Forms para configurar los elementos de 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
$vbLabelText   $csharpLabel
  • SetLicenseKey: Este método se llama para aplicar una clave de licencia válida para la biblioteca IronQR. El uso de una clave de licencia es obligatorio para aplicaciones comerciales y para desbloquear las capacidades completas de la biblioteca IronQR.

  • EnsureDirectoryExists: Dada la necesidad de guardar códigos QR generados, este método asegura que haya un directorio dedicado disponible. Comprueba si el directorio "QR Codes" existe en la ruta de inicio de la aplicación y lo crea si no lo hace.

4.2 Configuración de la clave de licencia

Para asegurar que IronQR opere sin limitaciones, se debe aplicar una clave de licencia válida. Esto se logra a través del 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 fragmento de código de abajo 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
$vbLabelText   $csharpLabel

Reemplace "YOUR_LICENSE_KEY" con la clave de licencia real que obtuvo de Iron Software. El método se llama dentro del constructor de la clase QR_Generator, asegurando que la licencia se aplique tan pronto como la aplicación se inicie y antes de que se realice cualquier generación de código QR.

4.3 Gestión de directorios

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

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
$vbLabelText   $csharpLabel

Este método utiliza el espacio de nombres System.IO para interactuar con el sistema de archivos. Primero comprueba si el directorio en la ruta especificada existe usando Directory.Exists. Si el directorio no existe (se retorna false), entonces crea el directorio usando 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":

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")
$vbLabelText   $csharpLabel

4.4 Selección de color

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 del fondo. Estos métodos aprovechan un cuadro de diálogo de color para permitir al usuario elegir colores.

Cuando se selecciona un color usando el cuadro de diálogo de color, el color elegido se convierte a un formato de string 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
$vbLabelText   $csharpLabel

El método UpdateColor toma el color seleccionado y lo convierte al formato Iron Software.Drawing.Color usando el string hexadecimal, y actualiza el color de primer plano o de fondo del código QR según la selección. También actualiza la UI 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
$vbLabelText   $csharpLabel

4.5 Agregar logotipo

La aplicación incluye un botón (btn_logo_Click) que, al hacer clic, abre un cuadro de diálogo de archivo permitiendo al usuario seleccionar un archivo de imagen que se utilizará como logo. Esta funcionalidad es crítica para negocios o individuos que buscan marcar sus códigos QR. Así es cómo se maneja el proceso de selección e integración de logo:

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
$vbLabelText   $csharpLabel

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

4.6 Generación de código 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 un 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
$vbLabelText   $csharpLabel

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 opciones de estilo. El método encapsula la creación de un código QR, aplicando los colores seleccionados, dimensiones, márgenes y, opcionalmente, un logo.

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
$vbLabelText   $csharpLabel

El objeto QrOptions define el nivel de corrección de errores, mejorando la resistencia del código QR a daños u ocultación. El método CreateStyleOptions genera un objeto QrStyleOptions, que incluye los ajustes personalizados del usuario como colores, dimensiones y el logo. Así es 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
$vbLabelText   $csharpLabel

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 de primer plano del código QR, permitiendo un aspecto personalizado que puede coincidir con las preferencias de marca o estéticas.
  • Dimensions: Esta propiedad determina el tamaño del código QR, ofreciendo flexibilidad en cómo el código QR se ajusta 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 elementos circundantes, lo cual puede ser crucial para la escalabilidad.
  • Logo: Si el usuario ha elegido incluir un logo, se configura aquí con dimensiones específicas y un radio de esquina para una apariencia pulida.

4.7 Guardar el código QR

La funcionalidad de guardado se activa por 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 mostrar un cuadro de diálogo de guardar archivo, permitiendo 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
$vbLabelText   $csharpLabel

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 asegura que la imagen se guarde en el formato correcto basado en 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
$vbLabelText   $csharpLabel

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

4.8 Restablecer la aplicación

La funcionalidad de restablecimiento está vinculada a un botón "Restablecer", que invoca el método btn_reset_Click. Este método, a su vez, llama a ResetFields, una función diseñada para limpiar todas las entradas del usuario y restaurar los valores predeterminados para todos los ajustes, incluidos los campos de texto, las selecciones de color y el logo 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 = bgColor;
    txt_selected_bgcolor.BackColor = color;
    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 = bgColor;
    txt_selected_bgcolor.BackColor = color;
    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 = bgColor
	txt_selected_bgcolor.BackColor = color
	logoBmp = Nothing
	selected_logo.Image = Nothing
	pictureBox.Image = Nothing
End Sub
$vbLabelText   $csharpLabel

Este método restablece cada componente involucrado en la generación de códigos QR. Por ejemplo, limpia el texto del código QR, establece las dimensiones y márgenes a valores predeterminados, y elimina cualquier color o logo seleccionados.

4.9 Manejo de errores

La aplicación utiliza el método ShowError para mostrar mensajes de error de manera amigable. Este método toma dos parámetros: un título y un mensaje, que proporcionan contexto sobre el error al usuario. Así es cómo está implementado:

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
$vbLabelText   $csharpLabel

Este método se utiliza en diferentes partes de la aplicación para asegurar que cuando ocurra un error, el usuario sea informado rápidamente con un mensaje claro y conciso. Por ejemplo, si ocurre un error al cargar el logo o durante el proceso de generación de códigos 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
$vbLabelText   $csharpLabel

Paso 5: Ejecutar la aplicación

Cuando se ejecuta la aplicación, la ventana principal aparece como se muestra en la imagen proporcionada. El diseño está organizado cuidadosamente en secciones para 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 en el proceso involucra introducir datos en el campo "Entrada de Texto de QR". Estos datos formarán el contenido del código QR, como un URL o información textual. A continuación, para personalizar el código QR, seleccionamos un logo haciendo clic en el botón "Seleccionar Logo". Al seleccionar, el logo se coloca visiblemente en el cuadro de vista previa adyacente al botón, confirmando su incorporación en el diseño del código QR.

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

Después de la selección del logo, elegimos los colores de primer plano y de fondo del código QR. Después de hacer clic en los respectivos botones, los colores elegidos se reflejan en los cuadros de visualización de color junto a cada botón, dándonos 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 particular, configuramos las dimensiones a 500, asegurando que el código sea de un tamaño adecuado para nuestras necesidades, y ajustamos los márgenes a 20, lo que proporciona un margen alrededor del código QR para prevenir problemas de escaneo.

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

Con todas las entradas y opciones de estilo establecidas, procedemos a generar el código QR haciendo clic en 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 - Resultados de Lectura de Códigos QR

Para guardar el código QR generado, simplemente hacemos clic en el botón "Guardar QR". Esta acción abre un cuadro de diálogo de guardado, permitiéndonos elegir el destino y el formato de archivo para nuestra imagen del código QR.

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

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

Cómo crear una aplicación generadora de códigos QR en C#: Figura 27 - Mensaje de Éxito

Si necesitamos comenzar de nuevo o crear un nuevo código QR, haciendo clic en el botón "Restablecer Formulario" restablece el formulario a su estado original, limpiando todos los campos y selecciones, listo para la próxima generación de código QR.

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

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 del Código QR

Conclusión

En conclusión, esta guía lo ha llevado a través del proceso de generación de códigos QR usando la biblioteca IronQR en una aplicación C#. Al desglosar los pasos desde configurar su proyecto en Visual Studio, integrar la biblioteca IronQR, diseñar una interfaz fácil de usar, y escribir la lógica backend, hemos demostrado cuán accesible es añadir funcionalidad de códigos QR a sus aplicaciones.

Para aquellos interesados en explorar más las capacidades de IronQR, vale la pena señalar que IronQR ofrece una prueba gratuita para comenzar. Si decides integrar IronQR en tus proyectos, las licencias comienzan en $799, proporcionando una solución rentable para la generación de códigos QR de nivel profesional.

Preguntas Frecuentes

¿Cómo creo una aplicación generadora de códigos QR en C#?

Para crear una aplicación generadora de códigos QR en C#, comienza configurando una aplicación de Windows Forms en Visual Studio. Instala la biblioteca IronQR a través de NuGet, diseña la interfaz con campos de entrada para texto, logotipo y color, luego implementa la lógica para la generación de códigos QR usando los métodos de IronQR.

¿Cuáles son las opciones de personalización disponibles para códigos QR en C#?

IronQR ofrece opciones de personalización para códigos QR, como alterar colores, dimensiones y márgenes. También puedes añadir logotipos a los códigos QR ajustando la configuración en el objeto QrStyleOptions.

¿Cómo instalo una biblioteca de Código QR en un proyecto de C#?

Instala la biblioteca IronQR en tu proyecto de C# usando el Administrador de Paquetes NuGet en Visual Studio. Busca IronQR y haz clic en el botón 'Instalar' para añadirlo a tu proyecto.

¿En qué formatos puedo guardar los códigos QR generados en C#?

Con IronQR, puedes guardar los códigos QR generados en varios formatos, incluidos PNG y JPEG, permitiendo flexibilidad en términos de calidad y tamaño de archivo.

¿Puedo leer códigos QR usando una biblioteca de C#?

Sí, IronQR incluye funcionalidad para leer códigos QR, permitiéndote decodificar y extraer datos de imágenes QR de manera efectiva.

¿Cuáles son los beneficios de usar una biblioteca de Código QR en C#?

Una biblioteca de Código QR en C# como IronQR simplifica el proceso de generación y lectura de códigos QR, ofreciendo características como soporte multi-formato, opciones de personalización y compatibilidad con varias versiones de .NET.

¿Cómo puedo manejar errores al generar códigos QR en C#?

El manejo de errores puede incorporarse en tu aplicación de generación de códigos QR usando bloques try-catch en C#. Esto asegura que cualquier problema durante la creación de códigos QR se maneje de manera suave, proporcionando retroalimentación amigable para el usuario.

¿Necesito una licencia para usar una biblioteca de Código QR en una aplicación de C#?

Sí, para usar IronQR sin limitaciones, necesitarás una clave de licencia válida. Una versión de prueba está disponible para pruebas iniciales, y las licencias profesionales pueden comprarse para acceso completo.

¿Cómo puedo integrar logotipos en códigos QR usando C#?

Con IronQR, puedes integrar logotipos en códigos QR estableciendo la imagen del logotipo en el objeto QrStyleOptions. Esto te permite personalizar códigos QR con elementos de marca.

¿Cuáles son los pasos para ejecutar una aplicación generadora de códigos QR en C#?

Después de configurar y personalizar tu aplicación generadora de códigos QR en C#, simplemente ejecuta la aplicación en Visual Studio, genera los códigos QR y usa las opciones proporcionadas para guardarlos en tu formato deseado.

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