Swift में QR कोड जनरेशन (iOS/macOS): Core Image से कस्टम समाधान तक
QR कोड आधुनिक ऐप्स का अहम हिस्सा बन गए हैं—लिंक शेयर करने से लेकर ऑथराइज़ेशन और पेमेंट तक। Apple प्लेटफॉर्म्स (iOS, macOS, watchOS, tvOS) पर QR कोड जनरेट करने के लिए एक शक्तिशाली बिल्ट-इन टूल है—Core Image फ्रेमवर्क, जिसमें CIQRCodeGenerator फिल्टर शामिल है। इस आर्टिकल में हम विस्तार से जानेंगे कि Swift में अपना खुद का QR कोड जनरेटर कैसे बनाएं, जिसमें रंग, साइज़, लोगो जोड़ना और SwiftUI के साथ इंटीग्रेशन शामिल है।
बेसिक्स: Core Image और CIQRCodeGenerator
Core Image, Apple का बिल्ट-इन इमेज प्रोसेसिंग फ्रेमवर्क है। CIQRCodeGenerator फिल्टर किसी भी स्ट्रिंग (URL, टेक्स्ट, कॉन्टैक्ट डेटा) से QR कोड बना सकता है। यह एरर करेक्शन (L, M, Q, H लेवल) सपोर्ट करता है और करेक्शन लेवल के आधार पर 7089 कैरेक्टर तक एनकोड कर सकता है।
UIImage के रूप में QR कोड जनरेट करने का बेसिक उदाहरण:
import UIKit
import CoreImage
func generateQRCode(from string: String) -> UIImage? {
let data = string.data(using: .utf8)
guard let filter = CIFilter(name: "CIQRCodeGenerator") else { return nil }
filter.setValue(data, forKey: "inputMessage")
filter.setValue("H", forKey: "inputCorrectionLevel") // अधिकतम एरर करेक्शन
guard let outputImage = filter.outputImage else { return nil }
// रिज़ॉल्यूशन बढ़ाएं (डिफ़ॉल्ट छोटा होता है)
let transform = CGAffineTransform(scaleX: 10, y: 10)
let scaledImage = outputImage.transformed(by: transform)
return UIImage(ciImage: scaledImage)
}
// उपयोग
if let qrImage = generateQRCode(from: "https://pythonlib.ru") {
// qrImage को UIImageView में दिखाएं
}
रंग और बैकग्राउंड सेट करना
डिफ़ॉल्ट रूप से QR कोड काले और सफेद होता है। रंग बदलने के लिए CIImage को UIImage में बदलें, फिर Core Graphics या CIFilter का उपयोग करें। सबसे आसान तरीका CIFalseColor का उपयोग करना है:
func generateColoredQRCode(from string: String, color: UIColor, backgroundColor: UIColor) -> UIImage? {
guard let data = string.data(using: .utf8),
let qrFilter = CIFilter(name: "CIQRCodeGenerator") else { return nil }
qrFilter.setValue(data, forKey: "inputMessage")
qrFilter.setValue("M", forKey: "inputCorrectionLevel")
guard let qrImage = qrFilter.outputImage else { return nil }
// कलर फिल्टर लगाएं
let colorFilter = CIFilter(name: "CIFalseColor")
colorFilter?.setValue(qrImage, forKey: "inputImage")
colorFilter?.setValue(CIColor(color: color), forKey: "inputColor0") // मॉड्यूल का रंग
colorFilter?.setValue(CIColor(color: backgroundColor), forKey: "inputColor1") // बैकग्राउंड का रंग
guard let coloredImage = colorFilter?.outputImage else { return nil }
let transform = CGAffineTransform(scaleX: 10, y: 10)
let scaledImage = coloredImage.transformed(by: transform)
return UIImage(ciImage: scaledImage)
}
QR कोड के बीच में लोगो जोड़ना
ब्रांडिंग के लिए अक्सर बीच में लोगो लगाना होता है। इससे पढ़ने की क्षमता कम हो सकती है, इसलिए उच्च एरर करेक्शन लेवल (H) का उपयोग करना बेहतर है। एल्गोरिदम: पहले QR कोड बनाएं, फिर उसके ऊपर लोगो के साथ UIImage लगाएं।
func generateQRWithLogo(from string: String, logo: UIImage, qrColor: UIColor = .black, bgColor: UIColor = .white) -> UIImage? {
guard let qrImage = generateColoredQRCode(from: string, color: qrColor, backgroundColor: bgColor) else { return nil }
let qrSize = qrImage.size
let logoSize = CGSize(width: qrSize.width * 0.25, height: qrSize.height * 0.25) // QR का 25%
let logoOrigin = CGPoint(x: (qrSize.width - logoSize.width) / 2,
y: (qrSize.height - logoSize.height) / 2)
UIGraphicsBeginImageContextWithOptions(qrSize, false, qrImage.scale)
qrImage.draw(at: .zero)
logo.draw(in: CGRect(origin: logoOrigin, size: logoSize))
let finalImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return finalImage
}