Generación de códigos QR en Swift (iOS/macOS): desde Core Image hasta soluciones personalizadas
\n\nLos códigos QR se han convertido en una parte esencial de las aplicaciones modernas, desde la transmisión de enlaces hasta la autenticación y el pago. En las plataformas de Apple (iOS, macOS, watchOS, tvOS) existe una potente herramienta integrada para generar códigos QR: el framework Core Image con el filtro CIQRCodeGenerator. En este artículo, analizaremos en detalle cómo crear tu propio generador de códigos QR en Swift, incluyendo la configuración de color, tamaño, la adición de un logotipo y la integración con SwiftUI.
Fundamentos: Core Image y CIQRCodeGenerator
\n\nCore Image es un framework integrado de Apple para el procesamiento de imágenes. El filtro CIQRCodeGenerator permite crear un código QR a partir de cualquier cadena (URL, texto, datos de contacto). Admite corrección de errores (niveles L, M, Q, H) y codificación de hasta 7089 caracteres (dependiendo del nivel de corrección).
Ejemplo básico de generación de un código QR 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") // Corrección de errores máxima\n \n guard let outputImage = filter.outputImage else { return nil }\n \n // Aumentamos la resolución (por defecto es pequeña)\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 // Mostramos qrImage en UIImageView\n}\n\nConfiguración de color y fondo
\n\nPor defecto, el código QR es blanco y negro. Para cambiar los colores, es necesario convertir CIImage a UIImage y luego realizar un relleno usando Core Graphics o CIFilter. La forma más sencilla es 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 // Aplicamos el filtro de color\n let colorFilter = CIFilter(name: "CIFalseColor")\n colorFilter?.setValue(qrImage, forKey: "inputImage")\n colorFilter?.setValue(CIColor(color: color), forKey: "inputColor0") // Color de los módulos\n colorFilter?.setValue(CIColor(color: backgroundColor), forKey: "inputColor1") // Color de fondo\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\nAñadir un logotipo en el centro del código QR
\n\nPara el branding, a menudo es necesario insertar un logotipo en el centro. Esto reduce la legibilidad, por lo que es mejor usar un nivel alto de corrección de errores (H). El algoritmo: primero creamos el código QR, luego superponemos un UIImage con el logotipo encima.
\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% del QR\n let logoOrigin = CGPoint(x: (qrSize.width - logoSize.width) / 2,\n y: (qrSize.height - logoSize.height) / 2)\n \n UIGraphicsBeginImageContextWithOptions(qrSize, fa También en la biblioteca
Planificador de tareas Swift: GCD, OperationQueue y Timer en iOS/macOS
NHibernate para C# (.NET): guía completa con ejemplos
Envío de correo electrónico en JavaScript (Node.js): nodemailer, sendgrid, mailgun
Criterion para Rust: guía completa con ejemplos
Configuración de aplicaciones PHP: bibliotecas y herramientas para una configuración flexible