توليد رموز QR بلغة Swift (iOS/macOS): من Core Image إلى الحلول المخصصة
\n\nأصبحت رموز QR جزءًا لا يتجزأ من التطبيقات الحديثة - بدءًا من نقل الروابط وصولاً إلى المصادقة والدفع. على منصات Apple (iOS، macOS، watchOS، tvOS) توجد أداة مدمجة قوية لتوليد رموز QR وهي إطار العمل Core Image مع الفلتر CIQRCodeGenerator. في هذه المقالة، سنشرح بالتفصيل كيفية إنشاء مولد رموز QR خاص بك بلغة Swift، بما في ذلك تخصيص اللون والحجم وإضافة الشعار والتكامل مع SwiftUI.
الأساسيات: Core Image وCIQRCodeGenerator
\n\nCore Image هو إطار عمل مدمج من Apple لمعالجة الصور. يسمح الفلتر CIQRCodeGenerator بإنشاء رمز QR من أي سلسلة نصية (URL، نص، بيانات اتصال). وهو يدعم تصحيح الأخطاء (المستويات L، M، Q، H) وترميز يصل إلى 7089 حرفًا (اعتمادًا على مستوى التصحيح).
مثال أساسي لتوليد رمز QR على شكل 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") // أقصى تصحيح للأخطاء\n \n guard let outputImage = filter.outputImage else { return nil }\n \n // زيادة الدقة (صغيرة افتراضيًا)\n let transform = CGAffineTransform(scaleX: 10, y: 10)\n let scaledImage = outputImage.transformed(by: transform)\n \n return UIImage(ciImage: scaledImage)\n}\n\n// الاستخدام\nif let qrImage = generateQRCode(from: "https://pythonlib.ru") {\n // عرض qrImage في UIImageView\n}\n\nتخصيص اللون والخلفية
\n\nافتراضيًا، يكون رمز QR أبيض وأسود. لتغيير الألوان، يجب تحويل CIImage إلى UIImage، ثم إجراء التعبئة باستخدام Core Graphics أو CIFilter. أسهل طريقة هي استخدام 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 // تطبيق فلتر الألوان\n let colorFilter = CIFilter(name: "CIFalseColor")\n colorFilter?.setValue(qrImage, forKey: "inputImage")\n colorFilter?.setValue(CIColor(color: color), forKey: "inputColor0") // لون الوحدات\n colorFilter?.setValue(CIColor(color: backgroundColor), forKey: "inputColor1") // لون الخلفية\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إضافة شعار في وسط رمز QR
\n\nللعلامات التجارية، غالبًا ما يكون من الضروري إدراج شعار في المنتصف. هذا يقلل من قابلية القراءة، لذا من الأفضل استخدام مستوى عالٍ من تصحيح الأخطاء (H). الخوارزمية: أولاً نقوم بإنشاء رمز QR، ثم نضع فوقه UIImage مع الشعار.
\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% من QR\n let logoOrigin = CGPoint(x: (qrSize.width - logoSize.width) / 2,\n y: (qrSize.height - logoSize.height) / 2)\n \n UIGraphicsBeginImageContextWithOptions(qrSize, fa