Pruebe en producción sin marcas de agua.
Funciona donde lo necesite.
Obtén 30 días de producto totalmente funcional.
Ténlo en funcionamiento en minutos.
Acceso completo a nuestro equipo de asistencia técnica durante la prueba del producto
Bienvenido a nuestra guía sobre cómo crear códigos QR usando 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, demostraremos cómo generar códigos QR de manera eficiente usando IronQR, asegurando que puedas generar un código QR adaptado a tus 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.
Crear una aplicación Windows Forms en Visual Studio
Instalación de la biblioteca QR con NuGet
Diseñar los elementos frontales del formulario
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 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, dar estilo y agregar logotipos a los códigos QR.
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.
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
Utilizamos el siguiente QR para escanear:
Cómo Crear una Aplicación Generadora de Códigos QR en C#: Figura 1 - Archivo de Imagen PNG de Código QR
Y obtenemos este resultado:
El proceso comienza incorporando los espacios de nombres necesarios, IronQr
, y IronSoftware.Drawing
, con una mención específica de Color
del espacio de nombres IronSoftware.Drawing
para manejar manipulaciones de imágenes.
Antes de sumergirse en el proceso de lectura del código 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")
.
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 como contenedor de la imagen.
El núcleo de esta función se encuentra en la clase QrReader
, que se instancia y 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 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, que se puede acceder y mostrar.
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 Escaneo Mixto, que equilibra la velocidad y la precisión, útil cuando los códigos QR no están claros o están parcialmente ocultos.
Otro es el Modo de Escaneo de Aprendizaje Automático (ML), que utiliza tecnología inteligente para leer códigos QR que están 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)
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
Esta es la salida cuando escaneamos el código QR usando IronQR:
Utilizamos el siguiente 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, 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.
Seleccione Windows Forms App como el 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 - Aplicación de Windows Forms
Introduce un nombre para tu proyecto y selecciona la ubicación para guardarlo. A continuación, en la siguiente pantalla, seleccione .NET framework. A continuación, haz 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.
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:
Escribe IronQR en el cuadro de búsqueda y presiona Enter.
Encuentre IronQR en la lista y haga clic en Instalar junto a él.
Vaya a Herramientas > Administrador de paquetes NuGet > Consola del administrador de paquetes.
Escriba Install-Package IronQR y presione Enter.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
Primero, la aplicación comienza con la inclusión de los espacios de nombres necesarios: IronQr
y IronSoftware.Drawing
. Estos namespaces son esenciales ya que proporcionan las funcionalidades necesarias para generar y manipular códigos QR y colores dentro de la aplicación. La clase Color
personalizada se define para facilitar la gestión de colores en la generación de códigos QR, anulando la clase predeterminada 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
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
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 las aplicaciones comerciales y para desbloquear todas las capacidades de la biblioteca IronQR.
EnsureDirectoryExists
: Dada la necesidad de guardar los códigos QR generados, este método garantiza que haya 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.
Para garantizar que IronQR funciona sin limitaciones, debe aplicarse 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 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
Sustituye "YOUR\_LICENSE\_KEY"
por la clave de licencia real que obtuviste 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 comience y antes de que se realice cualquier generación de código QR.
La aplicación utiliza el método EnsureDirectoryExists
para verificar si el directorio especificado para almacenar códigos QR existe. Si no, crea el directorio. Este método toma un parámetro string
, que es la ruta del directorio a verificar 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
Este método utiliza el espacio de nombres System.IO
para interactuar con el sistema de archivos. Primero verifica si el directorio en la ruta especificada existe utilizando Directory.Exists
. Si el directorio no existe (false
es devuelto), 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 el nombre de la 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")
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
El método UpdateColor
toma el color seleccionado y lo convierte al formato IronSoftware.Drawing.Color utilizando la cadena hexadecimal, y actualiza ya sea el color del 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
La aplicación incluye un botón (btn_logo_Click) que, al hacer clic, abre un cuadro de diálogo de archivo que permite al usuario seleccionar un archivo de imagen para usar como logo. 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
Al seleccionar correctamente una imagen, la aplicación intenta cargarla y mostrar una vista previa. El objeto AnyBitmap
, logoBmp
, se establece con la imagen seleccionada, que luego utiliza la lógica de generación de 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 desencadenante, llamando a la función GenerateQRCode
donde reside la lógica real de generación.
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
Dentro del método GenerateQRCode
, la aplicación construye un código QR basado en los parámetros especificados, incluidos 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
El objeto QrOptions
define el nivel de corrección de errores, mejorando la resistencia del código QR a daños u obstrucciones. El método CreateStyleOptions
genera un objeto QrStyleOptions
, que incluye las configuraciones personalizadas 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
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 adapta a 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 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 en las esquinas para un acabado pulido.La funcionalidad de guardado se activa con 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
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 guarde en el formato correcto según 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
Esta flexibilidad permite a los usuarios elegir el formato que mejor se adapte a sus necesidades, ya sea priorizando la calidad (PNG) o el tamaño del archivo (JPEG).
La funcionalidad de restablecer está vinculada a un botón "Reset", 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 predeterminados para todas las configuraciones, incluidas las casillas 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
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.
La aplicación utiliza el método ShowError
para mostrar mensajes de error de manera amigable para el usuario. 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
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 ocurre 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.
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
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.
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.
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.
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.
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.
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.
Una vez guardado, un mensaje de éxito confirma que el código QR se ha almacenado correctamente.
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.
Aquí está el código QR guardado generado por IronQR:
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 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 $749, ofreciendo una solución rentable para la generación de códigos QR de calidad profesional.