Geração de QR Codes em Swift (iOS/macOS): do Core Image às soluções personalizadas
\n\nOs QR Codes se tornaram parte essencial dos aplicativos modernos — desde o compartilhamento de links até autenticação e pagamentos. Nas plataformas Apple (iOS, macOS, watchOS, tvOS), existe uma ferramenta integrada poderosa para gerar QR Codes: o framework Core Image com o filtro CIQRCodeGenerator. Neste artigo, vamos detalhar como criar seu próprio gerador de QR Codes em Swift, incluindo configuração de cor, tamanho, adição de logotipo e integração com SwiftUI.
Fundamentos: Core Image e CIQRCodeGenerator
\n\nCore Image é um framework integrado da Apple para processamento de imagens. O filtro CIQRCodeGenerator permite criar um QR Code a partir de qualquer string (URL, texto, dados de contato). Ele suporta correção de erros (níveis L, M, Q, H) e codificação de até 7089 caracteres (dependendo do nível de correção).
Exemplo básico de geração de QR Code como UIImage:
\n\nimport UIKit\nimport CoreImage\n\nfunc generateQRCode(from string: String) -> UIImage? {\n let data = string.data(using: .utf8)\n guard let filter = CIFilter(name: "CIQRCodeGenerator") else { return nil }\n filter.setValue(data, forKey: "inputMessage")\n filter.setValue("H", forKey: "inputCorrectionLevel") // Correção máxima de erros\n \n guard let outputImage = filter.outputImage else { return nil }\n \n // Aumenta a resolução (padrão é pequena)\n let transform = CGAffineTransform(scaleX: 10, y: 10)\n let scaledImage = outputImage.transformed(by: transform)\n \n return UIImage(ciImage: scaledImage)\n}\n\n// Uso\nif let qrImage = generateQRCode(from: "https://pythonlib.ru") {\n // Exibe qrImage em UIImageView\n}\n\nConfiguração de cor e fundo
\n\nPor padrão, o QR Code é preto e branco. Para alterar as cores, é necessário converter CIImage para UIImage e, em seguida, realizar a coloração usando Core Graphics ou CIFilter. A maneira mais simples é usar CIFalseColor:
func generateColoredQRCode(from string: String, color: UIColor, backgroundColor: UIColor) -> UIImage? {\n guard let data = string.data(using: .utf8),\n let qrFilter = CIFilter(name: "CIQRCodeGenerator") else { return nil }\n qrFilter.setValue(data, forKey: "inputMessage")\n qrFilter.setValue("M", forKey: "inputCorrectionLevel")\n \n guard let qrImage = qrFilter.outputImage else { return nil }\n \n // Aplica o filtro de cor\n let colorFilter = CIFilter(name: "CIFalseColor")\n colorFilter?.setValue(qrImage, forKey: "inputImage")\n colorFilter?.setValue(CIColor(color: color), forKey: "inputColor0") // Cor dos módulos\n colorFilter?.setValue(CIColor(color: backgroundColor), forKey: "inputColor1") // Cor do fundo\n \n guard let coloredImage = colorFilter?.outputImage else { return nil }\n \n let transform = CGAffineTransform(scaleX: 10, y: 10)\n let scaledImage = coloredImage.transformed(by: transform)\n \n return UIImage(ciImage: scaledImage)\n}\n\nAdicionando logotipo no centro do QR Code
\n\nPara branding, é comum inserir um logotipo no centro. Isso reduz a legibilidade, por isso é melhor usar um alto nível de correção de erros (H). Algoritmo: primeiro crie o QR Code, depois sobreponha uma UIImage com o logotipo.
\n\nfunc generateQRWithLogo(from string: String, logo: UIImage, qrColor: UIColor = .black, bgColor: UIColor = .white) -> UIImage? {\n guard let qrImage = generateColoredQRCode(from: string, color: qrColor, backgroundColor: bgColor) else { return nil }\n \n let qrSize = qrImage.size\n let logoSize = CGSize(width: qrSize.width * 0.25, height: qrSize.height * 0.25) // 25% do QR\n let logoOrigin = CGPoint(x: (qrSize.width - logoSize.width) / 2,\n y: (qrSize.height - logoSize.height) / 2)\n \n UIGraphicsBeginImageContextWithOptions(qrSize, fa Também na biblioteca
Biblioteca Padrão TypeScript: guia completo para desenvolvedores
Filas de Tarefas em Go (Golang): Melhores Bibliotecas e Ferramentas
GraphQL em Node.js: Guia Completo da Biblioteca graphql-http
Configuração de aplicações TypeScript: bibliotecas e ferramentas
Hangfire para C# (.NET): guia completo com exemplos