Swift QR-Code-Generator: Core Image, CIFilter und eigene Lösungen

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

QR-Code-Generierung in Swift (iOS/macOS): von Core Image bis zu benutzerdefinierten Lösungen

\n\n

QR-Codes sind zu einem festen Bestandteil moderner Anwendungen geworden – von der Übertragung von Links bis hin zur Autorisierung und Bezahlung. Auf Apple-Plattformen (iOS, macOS, watchOS, tvOS) gibt es ein integriertes leistungsstarkes Werkzeug zur Generierung von QR-Codes – das Framework Core Image mit dem Filter CIQRCodeGenerator. In diesem Artikel werden wir im Detail besprechen, wie man einen eigenen QR-Code-Generator in Swift erstellt, einschließlich der Anpassung von Farbe, Größe, Hinzufügen eines Logos und der Integration mit SwiftUI.

\n\n

Grundlagen: Core Image und CIQRCodeGenerator

\n\n

Core Image ist ein integriertes Apple-Framework zur Bildverarbeitung. Der Filter CIQRCodeGenerator ermöglicht die Erstellung eines QR-Codes aus einem beliebigen String (URL, Text, Kontaktdaten). Er unterstützt Fehlerkorrektur (Stufen L, M, Q, H) und die Kodierung von bis zu 7089 Zeichen (abhängig von der Korrekturstufe).

\n\n

Ein grundlegendes Beispiel zur Generierung eines QR-Codes als 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") // Maximale Fehlerkorrektur\n    \n    guard let outputImage = filter.outputImage else { return nil }\n    \n    // Auflösung erhöhen (standardmäßig klein)\n    let transform = CGAffineTransform(scaleX: 10, y: 10)\n    let scaledImage = outputImage.transformed(by: transform)\n    \n    return UIImage(ciImage: scaledImage)\n}\n\n// Verwendung\nif let qrImage = generateQRCode(from: "https://pythonlib.ru") {\n    // qrImage in UIImageView anzeigen\n}
\n\n

Farb- und Hintergrundanpassung

\n\n

Standardmäßig ist der QR-Code schwarz-weiß. Um die Farben zu ändern, muss das CIImage in ein UIImage umgewandelt und dann mit Core Graphics oder CIFilter gefüllt werden. Am einfachsten ist die Verwendung von 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    // Farbfilter anwenden\n    let colorFilter = CIFilter(name: "CIFalseColor")\n    colorFilter?.setValue(qrImage, forKey: "inputImage")\n    colorFilter?.setValue(CIColor(color: color), forKey: "inputColor0")   // Farbe der Module\n    colorFilter?.setValue(CIColor(color: backgroundColor), forKey: "inputColor1") // Hintergrundfarbe\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

Hinzufügen eines Logos in der Mitte des QR-Codes

\n\n

Für Branding-Zwecke muss oft ein Logo in der Mitte eingefügt werden. Dies verringert die Lesbarkeit, daher sollte eine hohe Fehlerkorrekturstufe (H) verwendet werden. Algorithmus: Zuerst wird ein QR-Code erstellt, dann wird ein UIImage mit dem Logo darüber gelegt.

\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% des QR-Codes\n    let logoOrigin = CGPoint(x: (qrSize.width - logoSize.width) / 2,\n                             y: (qrSize.height - logoSize.height) / 2)\n    \n    UIGraphicsBeginImageContextWithOptions(qrSize, fa                    

Empfehlungen