Como criar um aplicativo gerador de código QR em C#
Bem-vindo ao nosso guia sobre como criar códigos QR usando C#! Os códigos QR e as DLLs de código de barras .NET tornaram-se formas populares de compartilhar informações de maneira rápida e eficiente. Seja para desenvolver um aplicativo, gerenciar um site ou simplesmente encontrar uma maneira prática de compartilhar links, esses códigos podem ser incrivelmente úteis. Neste guia, demonstraremos como gerar códigos QR de forma eficiente usando IronQR, garantindo que você possa gerar códigos QR adaptados às suas necessidades. Esta biblioteca facilita a criação de códigos QR para qualquer pessoa que trabalhe com C#, sem a necessidade de se aprofundar em lógica complexa. Vamos orientá-lo(a) em cada etapa, garantindo que você tenha tudo o que precisa para começar. Se você deseja adicionar a funcionalidade de geração de código QR ao seu aplicativo ou apenas tem curiosidade de saber como isso é feito, você está no lugar certo. Vamos começar.
Como Criar um Gerador de Código QR em C
- Crie uma Aplicação Windows Forms no Visual Studio
- Instale a Biblioteca QR usando NuGet
- Desenhe os elementos do frontend do formulário
- Escreva a lógica de geração de QR
- Execute a aplicação e comece a criar códigos QR
IronQR: Biblioteca QR em C
IronQR é uma biblioteca C# para códigos QR que permite integrar a funcionalidade de códigos QR em aplicações .NET . O IronQR oferece suporte a uma ampla variedade de versões do .NET e tipos de projeto, incluindo C#, VB .NET, F#, .NET Core, .NET Standard, .NET Framework e muito mais, garantindo compatibilidade com diversos ambientes de desenvolvimento, como Windows, Linux, macOS, iOS e Android.
O IronQR se destaca por seus recursos avançados, incluindo a capacidade de ler e gerar códigos QR , suporte a múltiplos formatos de imagem e opções de personalização como redimensionamento, estilização e adição de logotipos aos códigos QR.
Algumas características principais do IronQR
O IronQR amplia sua funcionalidade além da geração básica de códigos QR, oferecendo diversos recursos projetados para atender a uma ampla gama de tarefas relacionadas a códigos QR. Vamos passar por estas funcionalidades e verificar seus códigos de exemplo, que você poderá integrar em qualquer tipo de modelo de aplicação .NET como um aplicativo de console.
Leia os códigos QR
O IronQR se destaca na decodificação de códigos QR, proporcionando aos usuários uma maneira simples de acessar as informações contidas neles. Você pode extrair dados de códigos QR de forma rápida e precisa, desde URLs simples até informações complexas incorporadas.
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
Nós usamos o seguinte QR para escanear:

E obtivemos este resultado:

O processo começa incorporando os namespaces necessários, IronQr, e IronSoftware.Drawing, com uma menção específica de Color do namespace IronSoftware.Drawing para lidar com manipulações de imagem.
Antes de mergulhar no processo de leitura do código QR, é essencial ativar o software com sua chave de licença, atribuindo-a a IronQr.License.LicenseKey. O código então prossegue para carregar a imagem do código QR de um arquivo usando AnyBitmap.FromFile("QRCode.png").
Com a imagem carregada, o próximo passo envolve prepará-la para a detecção do código QR. Este preparo é feito criando um objeto QrImageInput, que serve como um contêiner para a imagem.
O núcleo desta funcionalidade reside na classe QrReader, que é instanciada e usada para realizar a operação de leitura do código QR. O leitor analisa a imagem preparada, qrInput, procurando por quaisquer códigos QR que ela contenha. O resultado desta operação é uma coleção de objetos QrResult, cada um representando um código QR detectado dentro da imagem.
Para acessar e utilizar os dados codificados nos códigos QR, o código itera sobre a coleção de resultados usando um loop foreach. Cada objeto QrResult contém propriedades como o valor do código QR, que pode ser acessado e exibido.
Opções personalizadas do modo de leitura de QR Code
IronQR oferece diferentes maneiras de ler códigos QR a partir de imagens, tornando-o versátil para várias necessidades. Uma opção é o Modo de Escaneamento Misto, que equilibra velocidade e precisão, útil quando os códigos QR não estão claros ou estão parcialmente ocultos.
Outra é o Modo de Varredura de Aprendizado de Máquina (ML), que usa tecnologia inteligente para ler códigos QR que estão danificados ou não são fáceis de ler normalmente. Esse modo é ótimo para situações difíceis onde os códigos QR são difíceis de detectar.
Por fim, há o Modo de Varredura Básico, que é a maneira mais rápida e simples de escanear códigos QR claros e diretos. É melhor quando você precisa de resultados rápidos e os códigos QR são fáceis de ler.
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)
Leia códigos QR avançados
As capacidades avançadas de leitura de código QR do IronQR são projetadas para oferecer uma abordagem abrangente e sutil para escanear e decodificar códigos QR. Este conjunto de recursos vai além das funcionalidades básicas de leitura de código QR, proporcionando um nível mais profundo de interação e extração de dados.
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
Esta é a saída quando escaneamos o código QR usando o IronQR:

Usamos o seguinte Código QR:

Cada objeto QrResult fornece acesso aos dados decodificados (Value), quaisquer URLs embutidos (Url), e as coordenadas espaciais (Points) do código QR dentro da imagem.
Para cada código QR detectado, o IronQR oferece informações detalhadas, inclusive o conteúdo exato e quaisquer URLs contidos no código QR. Além disso, a biblioteca fornece as coordenadas precisas dos cantos do código QR na imagem (através da propriedade Points).
Para criar um gerador de Código QR usando a biblioteca IronQR de códigos QR em uma aplicação C#, siga estes passos cuidadosamente. Este guia irá orientá-lo na configuração de um aplicativo Windows Forms, na instalação da biblioteca IronQR , na escrita do código para gerar um código QR e na compreensão da saída.
Passo 1: Criar um aplicativo Windows no Visual Studio
- Comece lançando o Visual Studio no seu computador.
- Clique no botão "Criar um novo projeto".
-
Selecione Aplicativo de Formulários do Windows como o tipo de projeto. Certifique-se de escolher C# como linguagem.

-
Insira um nome para o seu projeto e selecione o local para salvá-lo. Em seguida, na tela seguinte, selecione .NET Framework. Em seguida, clique em Criar .

Isso criará e abrirá um aplicativo de formulários do Windows no Visual Studio.
Passo 2: Instale a biblioteca IronQR
Agora é hora de instalar a biblioteca IronQR no projeto. Você pode instalar a biblioteca IronQR por meio de diferentes métodos. Escolha aquele que se adapta à sua preferência:
Instale usando o Gerenciador de Pacotes NuGet
- Clique com o botão direito no seu projeto no Solution Explorer e selecione Gerenciar Pacotes NuGet.
-
Digite IronQR na caixa de busca e pressione Enter.

-
Encontre IronQR na lista e clique em Instalar ao lado dele.

Instale usando o Console do Gerenciador de Pacotes NuGet
- Vá para Ferramentas > Gerenciador de Pacotes NuGet > Console do Gerenciador de Pacotes.

- Digite Install-Package IronQR e pressione Enter.

Etapa 3: Projetar o Frontend

3.1 Cabeçalho do título

Ao iniciar o aplicativo Gerador de Código QR, os usuários são imediatamente apresentados a um cabeçalho impactante intitulado "QR Generator IronQR", em uma fonte ousada e imponente. A fonte, Agency FB, é selecionada por suas linhas limpas e modernas, que transmitem uma sensação de eficiência e precisão. Com um tamanho de fonte de 48 pontos, o título é tanto proeminente quanto afirmativo, capturando a atenção do usuário e estabelecendo firmemente a identidade do aplicativo.
3.2 Seção de Entrada
Entrada de texto para código QR

No coração da seção de entrada está um componente simples, mas fundamental: a caixa de entrada de texto. Aqui, os usuários podem digitar os dados que desejam codificar em seu código QR. A caixa é espaçosa, acomodando uma quantidade significativa de texto, e está posicionada de maneira proeminente perto do topo.
Seleção de logotipo

Abaixo da entrada de texto, a área 'Selecionar Logo' permite uma camada adicional de personalização. Os usuários podem carregar um logo que será incorporado ao código QR, aumentando o reconhecimento da marca ou personalizando o código. A caixa de imagem adjacente fornece uma pré-visualização do logo selecionado, oferecendo feedback visual imediato.
Configuração de cores

Movendo-se para a direita, a interface apresenta opções para seleção de cores. Dois botões, um para a cor do código QR e outro para a cor de fundo, permitem aos usuários personalizar a paleta do código QR. As caixas de texto ricas ao lado desses botões mostram a cor atualmente selecionada.
O layout cuidadoso da seção de entrada, com suas opções de texto, logo e cor, reflete um entendimento claro das prioridades dos usuários ao criar um código QR. Ele combina funcionalidade com flexibilidade, permitindo que os usuários insiram rápida e eficientemente as informações necessárias enquanto também oferecem espaço para criatividade.
3.3 Parâmetros de Estilização

Configurações de dimensão
Ao lado das ferramentas de personalização de cor, os usuários encontrarão a entrada para 'Dimensões'. Esta configuração numérica é crítica, pois dita o tamanho geral do código QR, garantindo que ele se encaixe perfeitamente dentro do contexto de exibição pretendido, seja um cartão de visita, um panfleto ou uma tela digital.
Configurações de margem
Ao lado da entrada de dimensão, o campo 'Margens' permite aos usuários especificar o espaço em branco ao redor do código QR. As margens são mais do que apenas uma escolha estética; elas são um elemento funcional que pode afetar a legibilidade do código QR pelos scanners. O aplicativo fornece um controle numérico de aumento e diminuição para que os usuários ajustem facilmente este parâmetro.
3.4 Pré-visualização da saída

Uma vez que o usuário inicia a geração do código QR, a grande caixa de imagem no lado esquerdo do formulário, rotulada como 'Saída', torna-se o ponto focal. Ela serve como um display dinâmico, fornecendo uma pré-visualização em tempo real do código QR gerado. Este feedback visual imediato é essencial para que os usuários verifiquem suas escolhas de design e garantam que o código QR atenda às suas expectativas antes de salvar.
3.5 Botões de ação
Gerar QR

O botão 'Gerar QR' é um elemento de controle fundamental na interface do aplicativo. Posicionado estrategicamente dentro do formulário, este botão é o catalisador para o processo de criação do código QR. Ao clicar neste botão, o aplicativo coleta todos os dados de entrada e parâmetros de estilo definidos pelo usuário e inicia a geração de um código QR personalizado.
Salvar código QR

Uma vez que um código QR foi gerado e está exibido na área de pré-visualização da saída, o botão 'Salvar QR' entra em ação. Ao ser clicado, ele abre um diálogo de salvamento, permitindo ao usuário escolher o formato de arquivo desejado e o local de salvamento.
Redefinir formulário

Com um único clique, este botão limpa todas as entradas e seleções anteriores, restaurando todas as configurações para seus valores padrão. É um aspecto importante do formulário, oferecendo uma maneira rápida de reinicializar o aplicativo sem ajustar manualmente cada opção.
Etapa 4: Escrever a lógica de backend
4.1 Configuração e Inicialização
Primeiro, a aplicação começa com a inclusão dos namespaces necessários: IronQr e IronSoftware.Drawing. Esses namespaces são essenciais, pois fornecem as funcionalidades necessárias para gerar e manipular códigos QR e cores dentro do aplicativo. A classe customizada Color é definida para facilitar o gerenciamento de cores na geração de código QR, substituindo o padrão System.Drawing.Color para garantir compatibilidade com os requisitos do 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
O construtor da classe QR_Generator desempenha um papel crucial na preparação da aplicação para uso. É aqui que os componentes do aplicativo são inicializados, o que é um passo padrão em aplicações Windows Forms para configurar os elementos da interface do usuário do formulário.
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 é chamado para aplicar uma chave de licença válida para a biblioteca IronQR. O uso de uma chave de licença é obrigatório para aplicações comerciais e para desbloquear as capacidades totais da biblioteca IronQR. EnsureDirectoryExists: Dada a necessidade de salvar os códigos QR gerados, este método garante que haja um diretório dedicado disponível. Ele verifica se o diretório 'QR Codes' existe no caminho de inicialização do aplicativo e o cria se não existir.
4.2 Configuração da chave de licença
Para garantir que o IronQR opere sem limitações, deve-se aplicar uma chave de licença válida. Isso é realizado através do método SetLicenseKey, que é um método estático projetado para configurar a biblioteca com sua chave de licença adquirida ou de teste. O trecho de código abaixo ilustra como definir a chave de licença:
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
Substitua "YOUR_LICENSE_KEY" pela chave de licença real que você obteve da Iron Software. O método é chamado dentro do construtor da classe QR_Generator, garantindo que a licença seja aplicada assim que a aplicação iniciar e antes de qualquer geração de código QR ocorrer.
4.3 Gerenciamento de diretórios
A aplicação usa o método EnsureDirectoryExists para verificar se o diretório especificado para armazenar os códigos QR existe. Caso contrário, ele cria o diretório. Este método recebe um parâmetro string, que é o caminho do diretório a ser verificado ou criado. Veja como é 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
Este método utiliza o namespace System.IO para interagir com o sistema de arquivos. Primeiro, verifica se o diretório no caminho especificado existe usando Directory.Exists. Se o diretório não existir (false é retornado), ele então cria o diretório usando Directory.CreateDirectory.
O caminho para o diretório de códigos QR é definido no construtor da classe QR_Generator como qrCodesDirectory, que combina o caminho de inicialização da aplicação com o nome da pasta "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")
4.4 Seleção de Cores
A aplicação fornece dois botões na interface do usuário, cada um vinculado a um método para selecionar cores: btn_color_Click para a cor do código QR e btn_background_Click para a cor de fundo. Estes métodos aproveitam uma caixa de diálogo de cores para permitir que o usuário escolha as cores.
Quando uma cor é selecionada usando a caixa de diálogo de cores, a cor escolhida é então convertida para um formato de string hexadecimal. Isso é necessário porque a biblioteca IronQR exige que as cores sejam especificadas no formato hexadecimal. A conversão é realizada através do 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
O método UpdateColor pega a cor selecionada e a converte para o formato IronSoftware.Drawing.Color usando a string hexadecimal, e atualiza a cor do primeiro plano ou do fundo do código QR, dependendo da seleção. A interface do usuário também é atualizada para refletir a nova escolha de cores:
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
4.5 Adicionando um logotipo
O aplicativo inclui um botão (btn_logo_Click) que, ao ser clicado, abre um diálogo de arquivo que permite ao usuário selecionar um arquivo de imagem para ser usado como logotipo. Esta funcionalidade é crítica para empresas ou indivíduos que desejam personalizar seus códigos QR. Veja como o processo de seleção e integração do logotipo é tratado:
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
Após selecionar uma imagem com sucesso, o aplicativo tenta carregá-la e exibir uma pré-visualização. O objeto AnyBitmap, logoBmp, é então configurado com a imagem selecionada, que a lógica de geração de QR usará posteriormente.
4.6 Geração de código QR
O processo de geração começa quando o usuário clica no botão "Gerar", que está vinculado ao método btn_generate_Click. Este método atua como um gatilho, chamando a função GenerateQRCode onde reside a lógica de geração 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
Dentro do método GenerateQRCode, a aplicação constrói um código QR baseado nos parâmetros especificados, incluindo o texto de entrada e opções de estilo. O método encapsula a criação de um código QR, aplicando as cores selecionadas, dimensões, margens e, opcionalmente, um 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
O objeto QrOptions define o nível de correção de erro, aumentando a resiliência do código QR a danos ou obscuridades. O método CreateStyleOptions gera um objeto QrStyleOptions, que inclui configurações personalizadas do usuário, como cores, dimensões e o logotipo. Segue o método em detalhes:
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 cria um objeto QrStyleOptions, que é então usado pela lógica de geração de código QR para aplicar as preferências do usuário. As opções incluem:
BackgroundColoreColor: Estas propriedades definem as cores de fundo e primeiro plano do código QR, permitindo um visual personalizado que pode combinar com preferências de marca ou estética.Dimensions: Esta propriedade determina o tamanho do código QR, oferecendo flexibilidade em como o código QR se encaixa em diferentes contextos ou mídias.Margins: Esta propriedade define o tamanho da margem ao redor do código QR, garantindo que ele esteja isolado de elementos circundantes, o que pode ser crucial para escalabilidade.Logo: Se o usuário escolheu incluir um logotipo, ele é configurado aqui com dimensões específicas e um raio de canto para um visual refinado.
4.7 Salvando o código QR
A funcionalidade de salvamento é acionada pelo botão "Economize", que está vinculado ao método btn_save_Click. Este método chama SaveQRCode, que implementa a lógica de salvamento. O processo inclui a exibição de uma caixa de diálogo de salvamento de arquivo, permitindo que o usuário escolha o formato e o local do arquivo para salvar o 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 verifica se há um código QR gerado disponível. Se houver, ele apresenta ao usuário opções para salvar o arquivo nos formatos PNG ou JPEG. A função DetermineImageFormat garante que a imagem seja salva no formato correto com base na extensão de arquivo escolhida pelo usuário.
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
Essa flexibilidade permite aos usuários escolher o formato que melhor se adapta às suas necessidades, seja priorizando qualidade (PNG) ou tamanho de arquivo (JPEG).
4.8 Reiniciando o Aplicativo
A funcionalidade de reinicialização está vinculada a um botão "Resetar", que invoca o método btn_reset_Click. Este método, por sua vez, chama ResetFields, uma função projetada para limpar todas as entradas do usuário e restaurar valores padrão para todas as configurações, incluindo campos de texto, seleções de cor e o logotipo selecionado.
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
Este método redefine cada componente envolvido na geração do código QR. Por exemplo, ele limpa o texto do código QR, define as dimensões e margens para os valores padrão e remove quaisquer cores ou logotipos selecionados.
4.9 Tratamento de erros
A aplicação utiliza o método ShowError para exibir mensagens de erro de maneira amigável ao usuário. Este método recebe dois parâmetros: um título e uma mensagem, que fornecem contexto sobre o erro ao usuário. Veja como é 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
Este método é utilizado em diferentes partes do aplicativo para garantir que, quando um erro ocorrer, o usuário seja informado rapidamente com uma mensagem clara e concisa. Por exemplo, se um erro ocorrer ao carregar o logotipo ou durante o processo de geração do código QR, a aplicação chama ShowError para exibir detalhes sobre o problema.
4.10 Exemplo de código completo
Aqui está o código completo que o ajudará a entender o código com muito mais facilidade:
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
Etapa 5: Executar o aplicativo
Quando o aplicativo é executado, a janela principal aparece conforme mostrado na imagem fornecida. O layout está organizado em seções de forma ordenada para entrada, estilo, saída e ações.

O primeiro passo do processo envolve inserir dados no campo "Texto de Entrada QR". Esses dados formarão o conteúdo do código QR, como um URL ou informações textuais. Em seguida, para personalizar o código QR, selecionamos um logotipo clicando no botão "Selecionar Logotipo". Após a seleção, o logotipo é colocado visivelmente na caixa de visualização adjacente ao botão, confirmando sua incorporação no design do código QR.

Após a seleção do logotipo, escolhemos as cores de fundo e primeiro plano do código QR. Após clicar nos respectivos botões, as cores escolhidas são refletidas nas caixas de exibição de cores ao lado de cada botão, nos dando uma confirmação visual imediata de nossas escolhas.

Para este código QR em particular, definimos as dimensões para 500, garantindo que o código tenha um tamanho adequado para nossas necessidades, e ajustamos as margens para 20, o que fornece um buffer ao redor do código QR para prevenir problemas de leitura.

Com todas as entradas e opções de estilo definidas, prosseguimos para gerar o código QR clicando no botão "Gerar QR". O aplicativo processa nossas entradas e exibe o código QR recém-criado na caixa de imagem de saída.

Para salvar o código QR gerado, simplesmente clicamos no botão "Salvar QR". Esta ação abre uma caixa de diálogo de salvamento, permitindo escolher o destino e o formato do arquivo para a imagem do código QR.

Uma vez salvo, uma mensagem de sucesso confirma que o código QR foi armazenado com sucesso.

Se precisarmos começar de novo ou criar um novo código QR, clicar no botão "Redefinir Formulário" reverte o formulário para seu estado original, limpando todos os campos e seleções, pronto para a próxima geração de código QR.

Aqui está o código QR salvo gerado pelo IronQR:

Conclusão
Em resumo, este guia apresentou o processo de geração de códigos QR usando a biblioteca IronQR em uma aplicação C#. Ao detalhar as etapas, desde a configuração do seu projeto no Visual Studio, a integração da biblioteca IronQR , o design de uma interface amigável e a escrita da lógica de backend, demonstramos como é acessível adicionar a funcionalidade de código QR aos seus aplicativos.
Para aqueles interessados em explorar mais as capacidades do IronQR, vale notar que o IronQR oferece um teste gratuito para você começar. Se você decidir integrar o IronQR em seus projetos, as licenças começam em $799, proporcionando uma solução custo-efetiva para geração de código QR de nível profissional.
Perguntas frequentes
Como faço para criar um aplicativo gerador de código QR em C#?
Para criar um aplicativo gerador de código QR em C#, comece configurando um aplicativo Windows Forms no Visual Studio. Instale a biblioteca IronQR via NuGet, projete a interface com campos de entrada para texto, logotipo e cor e, em seguida, implemente a lógica para geração de código QR usando os métodos do IronQR.
Quais são as opções de personalização disponíveis para códigos QR em C#?
O IronQR oferece opções de personalização para códigos QR, como alteração de cores, dimensões e margens. Você também pode adicionar logotipos aos códigos QR ajustando as configurações no objeto QrStyleOptions .
Como faço para instalar uma biblioteca de código QR em um projeto C#?
Instale a biblioteca IronQR em seu projeto C# usando o Gerenciador de Pacotes NuGet no Visual Studio. Pesquise por IronQR e clique no botão "Instalar" para adicioná-la ao seu projeto.
Quais formatos posso usar para salvar códigos QR gerados em C#?
Com o IronQR, você pode salvar códigos QR gerados em vários formatos, incluindo PNG e JPEG, o que permite flexibilidade em termos de qualidade e tamanho do arquivo.
Posso ler códigos QR usando uma biblioteca C#?
Sim, o IronQR inclui funcionalidades para leitura de códigos QR, permitindo decodificar e extrair dados de imagens QR de forma eficaz.
Quais são os benefícios de usar uma biblioteca de código QR em C#?
Bibliotecas de código QR para AC#, como o IronQR, simplificam o processo de geração e leitura de códigos QR, oferecendo recursos como suporte a múltiplos formatos, opções de personalização e compatibilidade com diversas versões do .NET.
Como posso lidar com erros ao gerar códigos QR em C#?
É possível incorporar o tratamento de erros em seu aplicativo de geração de código QR usando blocos try-catch em C#. Isso garante que quaisquer problemas durante a criação do código QR sejam gerenciados sem problemas, fornecendo feedback amigável ao usuário.
Preciso de uma licença para usar uma biblioteca de código QR em um aplicativo C#?
Sim, para usar o IronQR sem limitações, você precisará de uma chave de licença válida. Uma versão de avaliação está disponível para testes iniciais, e licenças profissionais podem ser adquiridas para acesso completo.
Como posso integrar logotipos em códigos QR usando C#?
Com o IronQR, você pode integrar logotipos em códigos QR definindo a imagem do logotipo no objeto QrStyleOptions . Isso permite personalizar códigos QR com elementos da sua marca.
Quais são os passos para executar um aplicativo gerador de código QR em C#?
Após configurar e personalizar seu aplicativo gerador de código QR em C#, basta executar o aplicativo no Visual Studio, gerar os códigos QR e usar as opções fornecidas para salvá-los no formato desejado.



