Gerador de QR Codes em Swift: Core Image, CIFilter e Soluções Próprias

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Geração de QR Codes em Swift (iOS/macOS): do Core Image às soluções personalizadas

\n\n

Os 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.

\n\n

Fundamentos: Core Image e CIQRCodeGenerator

\n\n

Core 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).

\n\n

Exemplo básico de geração de QR Code como UIImage:

\n\n
import 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\n

Configuração de cor e fundo

\n\n

Por 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:

\n\n
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\n

Adicionando logotipo no centro do QR Code

\n\n

Para 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\n
func 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                    

Recommendations