- Guia de Uso (Portugues) — PNG, SVG, PDF, ASCII, Base64, Postscript, QR Codes Artisticos
- Usage Guide (English) — PNG, SVG, PDF, ASCII, Base64, Postscript, Artistic QR Codes
QRCoder.Core e uma biblioteca .NET multiplataforma para geracao de QR Codes usando SkiaSharp para renderizacao de imagens. Compativel com Windows, Linux, macOS e mobile (Xamarin / MAUI).
Baseado em QRCoder. Desenvolvido e mantido por AFONSOFT.
| Formato | Classe | Descricao |
|---|---|---|
| SKBitmap | QRCode |
Imagem bitmap SkiaSharp (multiplataforma) |
| PNG | PngByteQRCode |
Array de bytes PNG (sem System.Drawing) |
| SVG | SvgQRCode |
String de graficos vetoriais escalaveis |
PdfByteQRCode |
Documento PDF como array de bytes | |
| ASCII | AsciiQRCode |
Arte ASCII para saida em terminal |
| Base64 | Base64QRCode |
String de imagem codificada em Base64 |
| Postscript | PostscriptQRCode |
Formato Postscript/EPS |
| Artistico | ArtQRCode |
QR personalizado com pontos arredondados e fundos |
| BMP Bytes | BitmapByteQRCode |
Array de bytes Bitmap |
A classe PayloadGenerator fornece strings formatadas para casos de uso comuns de QR code:
| Payload | Descricao |
|---|---|
Url |
URL de website |
WiFi |
Credenciais de rede Wi-Fi |
Mail |
Email com assunto e corpo |
SMS |
Mensagem SMS |
PhoneNumber |
Numero de telefone |
MMS |
Mensagem multimidia |
Geolocation |
Coordenadas GPS |
CalendarEvent |
Evento de calendario (iCal/vEvent) |
ContactData |
Contato vCard / MeCard |
BitcoinLikeCryptoCurrencyAddress |
Pagamento Bitcoin/cripto |
Girocode |
Pagamento SEPA europeu |
BezahlCode |
Padrao de pagamento alemao |
SwissQrCode |
Pagamento QR-bill suico |
OneTimePassword |
TOTP/HOTP para 2FA |
ShadowSocksConfig |
Configuracao de proxy ShadowSocks |
Bookmark |
Favorito do navegador |
SkypeCall |
Link de chamada Skype |
WhatsAppMessage |
Mensagem WhatsApp |
RussiaPaymentOrder |
Ordem de pagamento russa |
SlovenianUpnQr |
Pagamento UPN QR esloveno |
| Metrica | Cobertura | Status |
|---|---|---|
| Cobertura de Linhas | 96,9% | Excelente |
| Cobertura de Branches | 92,6% | Excelente |
| Cobertura de Metodos | 96,0% | Excelente |
| Total de Testes | 502 | Todos Passaram |
Concluido - Mantido ativamente com pipelines modernos de CI/CD.
QRCoder.Core oferece uma base leve e multiplataforma para geracao de QR Codes, podendo ser embarcada em qualquer produto .NET — desde backends web e moveis ate aplicacoes desktop e ferramentas CLI. O objetivo e eliminar dependencias graficas especificas de plataforma, oferecendo uma API previsivel e extensivel para multiplos formatos de saida e payloads padronizados.
A biblioteca segue uma arquitetura de Clean Architecture:
- Geracao:
QRCodeGeneratorconstroi a matriz abstrataQRCodeData(models). - Payloads:
PayloadGeneratorformata strings padroes (Wi-Fi, vCard, SEPA, etc.) sem acoplamento a renderizacao. - Renderizacao: Implementacoes de
AbstractQRCodeproduzem formatos de saida (PNG, SVG, PDF, ASCII, Base64, Postscript, Art, BMP) usando SkiaSharp para renderizacao cross-platform. - Regra de dependencia:
AbstractionseModelsnao possuem dependencias externas;RendererseGeneratorsdependem apenas deModelseAbstractions. - Portoes de qualidade: build sem warnings, testes xUnit com ~97% de cobertura de linhas e analise estatica via SonarCloud / Codecov / Snyk.
Esta biblioteca e compativel com multiplas versoes do .NET:
- .NET Standard 2.1 — Compatibilidade maxima
- .NET 8.0 — LTS recomendado
- .NET 10.0 — Versao mais recente
- .NET Framework 4.8 — Suporte legado
Install-Package QRCoder.Coredotnet add package QRCoder.Core<PackageReference Include="QRCoder.Core" Version="2.0.1" />Gere seu primeiro QR code com apenas algumas linhas de codigo:
using System;
using System.IO;
using QRCoder.Core.Generators;
using QRCoder.Core.Models;
using QRCoder.Core.Renderers;
using SkiaSharp;
// Criar o gerador de QR Code
using var generator = new QRCodeGenerator();
using var data = generator.CreateQrCode("https://github.com/afonsoft/QRCoder.Core",
QRCodeGenerator.ECCLevel.M);
// Renderizar como bytes PNG (multiplataforma, sem System.Drawing)
using var png = new PngByteQRCode(data);
byte[] pngBytes = png.GetGraphic(10);
File.WriteAllBytes("qrcode.png", pngBytes);
// Ou renderizar como SKBitmap
using var qrCode = new QRCode(data);
using var bitmap = qrCode.GetGraphic(10);using System;
using System.IO;
using QRCoder.Core.Generators;
using QRCoder.Core.Models;
using QRCoder.Core.Renderers;
using SkiaSharp;
// Saida SVG
using var svg = new SvgQRCode(data);
string svgString = svg.GetGraphic(10);
// Saida ASCII (otimo para terminal)
using var ascii = new AsciiQRCode(data);
Console.WriteLine(ascii.GetGraphic(1));
// Saida PDF
using var pdf = new PdfByteQRCode(data);
byte[] pdfBytes = pdf.GetGraphic(5);
// Base64 PNG (embutir em HTML)
using var b64 = new Base64QRCode(data);
string base64Img = b64.GetGraphic(10);
// Com cores personalizadas
using var colorQr = new QRCode(data);
using var colorBmp = colorQr.GetGraphic(10, "#1a1a2e", "#e0e0e0");using System;
using System.IO;
using QRCoder.Core.Generators;
using QRCoder.Core.Models;
using QRCoder.Core.Renderers;
using SkiaSharp;
// QR Code Wi-Fi
var wifiPayload = new PayloadGenerator.WiFi("MinhaRede", "MinhaSenha",
PayloadGenerator.WiFi.Authentication.WPA);
using var gen = new QRCodeGenerator();
using var wifiData = gen.CreateQrCode(wifiPayload.ToString(), QRCodeGenerator.ECCLevel.M);
// QR Code URL
var urlPayload = new PayloadGenerator.Url("https://github.com/afonsoft/QRCoder.Core");
using var urlData = gen.CreateQrCode(urlPayload.ToString(), QRCodeGenerator.ECCLevel.M);
// QR Code Email
var mailPayload = new PayloadGenerator.Mail("teste@exemplo.com", "Assunto", "Corpo do texto");
using var mailData = gen.CreateQrCode(mailPayload.ToString(), QRCodeGenerator.ECCLevel.M);
// Numero de Telefone
var phonePayload = new PayloadGenerator.PhoneNumber("+5511999999999");
using var phoneData = gen.CreateQrCode(phonePayload.ToString(), QRCodeGenerator.ECCLevel.M);
// Cartao de Contato (vCard)
var contactPayload = new PayloadGenerator.ContactData(
PayloadGenerator.ContactData.ContactOutputType.VCard3,
"Silva", "Joao",
phone: "+5511999999999",
email: "joao.silva@exemplo.com");
using var contactData = gen.CreateQrCode(contactPayload.ToString(), QRCodeGenerator.ECCLevel.M);Consulte o Guia de Uso completo para todos os formatos de saida, tipos de payload, configuracoes avancadas e niveis de correcao de erro.
| Nivel | Recuperacao | Caso de Uso |
|---|---|---|
ECCLevel.L |
~7% | Capacidade maxima de dados |
ECCLevel.M |
~15% | Uso geral (recomendado) |
ECCLevel.Q |
~25% | Maior confiabilidade |
ECCLevel.H |
~30% | Recuperacao maxima de erros (logos, QR artistico) |
.
├── QRCoder.Core/ # Codigo-fonte da biblioteca principal
│ ├── Abstractions/ # Classe base e contratos
│ │ └── AbstractQRCode.cs # Classe base para todos os renderizadores
│ ├── Models/ # Modelo de dados e value objects
│ │ ├── QRCodeData.cs # Estrutura de dados do QR Code
│ │ └── Size.cs # Value object de dimensao de renderizacao
│ ├── Generators/ # Motor de geracao de QR Codes
│ │ ├── QRCodeGenerator.cs # Gerador principal de dados
│ │ └── PayloadGenerator.cs# Formatadores de payload (WiFi, URL, etc.)
│ ├── Renderers/ # Renderizadores por formato
│ │ ├── QRCode.cs # Renderizador SKBitmap
│ │ ├── PngByteQRCode.cs # Renderizador PNG byte array
│ │ ├── SvgQRCode.cs # Renderizador SVG string
│ │ ├── PdfByteQRCode.cs # Renderizador PDF byte array
│ │ ├── AsciiQRCode.cs # Renderizador ASCII art
│ │ ├── Base64QRCode.cs # Renderizador Base64
│ │ ├── PostscriptQRCode.cs# Renderizador Postscript/EPS
│ │ ├── ArtQRCode.cs # Renderizador QR artistico
│ │ └── BitmapByteQRCode.cs# Renderizador BMP byte array
│ ├── Extensions/ # Extensoes SkiaSharp e utilitarios
│ ├── Exceptions/ # Excecoes customizadas
│ └── Assets/ # Ativos do NuGet
├── QRCoder.Core.Tests/ # Testes unitarios (502 testes)
├── QRCoder.Core.Benchmarks/ # Benchmarks de performance
├── docs/ # Guias de uso
│ ├── en-US/usage-guide.md # Guia em ingles
│ └── pt-BR/guia-de-uso.md # Guia em portugues
├── .github/workflows/ # Pipelines de CI/CD
├── CHANGELOG.md # Historico de versoes
└── README.md / README.pt-br.md# Documentacao em ingles e portugues
Consulte o CHANGELOG.md completo para o historico de versoes.
- Documentacao XML em todas as APIs publicas (CS1591 removido do NoWarn).
- Secoes de estrutura do repositorio, visao de negocio e visao tecnica no README.
BDDTests.cscom testes no estilo Dado/Quando/Entao para validar geracao e renderizacao de QR Codes.
- Versao do pacote alterada para
2.0.1. - Badges de CI, NuGet, SonarCloud e Codecov atualizados nos arquivos README.
- Links do SonarCloud ajustados para o projeto correto (
afonsoft_QRCoder.Core). - CHANGELOG.md consolidado no padrao Keep a Changelog e SemVer.
- Badge do NuGet quebrado (agora via shields.io).
- Badge de build quebrado (agora
ci-build-test.yml). - SonarQube S2184 (divisao inteira no tamanho de midia do
PdfByteQRCode). - SonarQube S4136 ao agrupar overloads de
GetGraphicemQRCodeePdfByteQRCode.
- Reorganizacao do codigo com estrutura SOLID e Clean Architecture.
- Documentacao multi-idioma (en-US padrao + pt-BR).
- Frameworks-alvo atualizados: .NET Standard 2.1, .NET 8.0, .NET 10.0, .NET Framework 4.8.
- Manipulacao de bibliotecas nativas do SkiaSharp para CI Linux.
- Consolidacao dos workflows de publicacao.
- Migracao da renderizacao para SkiaSharp.
- Ajustes gerais no projeto e documentacao.
- Atualizacao de dependencias.
- Correcoes nas actions.
O projeto utiliza um pipeline completo de CI/CD com GitHub Actions:
- Build & Pack — Build principal com testes, cobertura e criacao de pacotes
- Code Quality — Analise de codigo com Qodana e SonarCloud
- Security Scans — Analise de seguranca com CodeQL, Snyk e SonarCloud
- Publish NuGet — Publicacao automatica para NuGet.org e GitHub Packages
- CI Build & Test — Build continuo e testes automatizados
# Build do projeto
dotnet build QRCoder.Core.sln --configuration Release
# Executar todos os testes com cobertura
dotnet test QRCoder.Core.Tests/QRCoder.Core.Tests.csproj \
--configuration Release \
--logger "trx;LogFileName=test-results.trx" \
--results-directory TestResults \
--collect:"XPlat Code Coverage"
# Gerar relatorio de cobertura HTML
dotnet tool install -g dotnet-reportgenerator-globaltool
reportgenerator \
-reports:"TestResults/**/coverage.cobertura.xml" \
-targetdir:"TestResults/CoverageReport" \
-reporttypes:"Html;XmlSummary;TextSummary"
# Visualizar relatorio: abra TestResults/CoverageReport/index.html-
Crie uma branch a partir da
main:git checkout -b feature/sua-feature
-
Faca suas alteracoes seguindo as convencoes de codigo
-
Os workflows automaticos serao executados:
- Build & Pack — Valida seu codigo
- Code Quality — Analisa qualidade
- Security Scan — Verifica seguranca
-
Pull Request: Crie um PR para
main -
Review e Merge: Apos aprovacao, seu codigo sera mergeado
- Afonso Dutra Nogueira Filho (AFONSOFT) — Desenvolvedor principal
Este projeto esta licenciado sob a Licenca MIT. Consulte o arquivo LICENSE.txt para mais detalhes.