Génération de QR codes en Swift (iOS/macOS) : de Core Image aux solutions personnalisées
\n\nLes QR codes sont devenus un élément essentiel des applications modernes — du partage de liens à l'authentification et au paiement. Sur les plateformes Apple (iOS, macOS, watchOS, tvOS), il existe un outil puissant intégré pour générer des QR codes : le framework Core Image avec le filtre CIQRCodeGenerator. Dans cet article, nous allons détailler comment créer votre propre générateur de QR codes en Swift, y compris la personnalisation des couleurs, de la taille, l'ajout d'un logo et l'intégration avec SwiftUI.
Les bases : Core Image et CIQRCodeGenerator
\n\nCore Image est un framework intégré d'Apple pour le traitement d'images. Le filtre CIQRCodeGenerator permet de créer un QR code à partir de n'importe quelle chaîne (URL, texte, coordonnées). Il prend en charge la correction d'erreurs (niveaux L, M, Q, H) et le codage jusqu'à 7089 caractères (selon le niveau de correction).
Exemple de base de génération d'un QR code sous forme d'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") // Correction d'erreurs maximale\n \n guard let outputImage = filter.outputImage else { return nil }\n \n // Augmenter la résolution (par défaut petite)\n let transform = CGAffineTransform(scaleX: 10, y: 10)\n let scaledImage = outputImage.transformed(by: transform)\n \n return UIImage(ciImage: scaledImage)\n}\n\n// Utilisation\nif let qrImage = generateQRCode(from: "https://pythonlib.ru") {\n // Afficher qrImage dans UIImageView\n}\n\nPersonnalisation des couleurs et de l'arrière-plan
\n\nPar défaut, le QR code est en noir et blanc. Pour changer les couleurs, il faut convertir CIImage en UIImage, puis effectuer un remplissage avec Core Graphics ou CIFilter. Le plus simple est d'utiliser 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 // Appliquer le filtre de couleur\n let colorFilter = CIFilter(name: "CIFalseColor")\n colorFilter?.setValue(qrImage, forKey: "inputImage")\n colorFilter?.setValue(CIColor(color: color), forKey: "inputColor0") // Couleur des modules\n colorFilter?.setValue(CIColor(color: backgroundColor), forKey: "inputColor1") // Couleur de fond\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\nAjout d'un logo au centre du QR code
\n\nPour le branding, il est souvent nécessaire d'insérer un logo au centre. Cela réduit la lisibilité, il est donc préférable d'utiliser un niveau de correction d'erreurs élevé (H). Algorithme : d'abord créer le QR code, puis superposer l'UIImage avec le logo par-dessus.
\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% du QR\n let logoOrigin = CGPoint(x: (qrSize.width - logoSize.width) / 2,\n y: (qrSize.height - logoSize.height) / 2)\n \n UIGraphicsBeginImageContextWithOptions(qrSize, fa