مولد رموز QR باستخدام Kotlin مع ZXing
\n\nأصبحت رموز QR (الاستجابة السريعة) جزءًا لا يتجزأ من العالم الرقمي الحديث. تُستخدم للتبادل السريع للروابط، بيانات الاتصال، كلمات مرور Wi-Fi ومعلومات أخرى. إذا كنت تطور تطبيقًا باستخدام Kotlin - سواء لنظام Android، أو للخادم (Ktor، Spring) أو لسطح المكتب (Compose Desktop) - فقد تحتاج إلى دمج وظيفة توليد رموز QR. في هذه المقالة، سنستعرض كيفية إنشاء مولد رموز QR بسيط وفعال باستخدام Kotlin، مع استخدام المكتبة الشهيرة ZXing (Zebra Crossing).
\n\nلماذا ZXing؟
\nZXing هي مكتبة متعددة الوظائف لقراءة وكتابة الباركود ورموز QR. مكتوبة بلغة Java، مما يجعلها متوافقة تمامًا مع Kotlin. المزايا الرئيسية:
\n- \n
- دعم تنسيقات مختلفة: رمز QR، Data Matrix، Aztec، PDF417 وغيرها. \n
- أداء عالٍ وقابلية تخصيص عالية. \n
- مجتمع نشط وتحديثات منتظمة. \n
- سهولة التكامل مع مشاريع Kotlin. \n
إضافة المكتبة
\nللبدء، أضف التبعية إلى ملف build.gradle.kts الخاص بك (إذا كنت تستخدم Gradle):
dependencies {\n implementation("com.google.zxing:core:3.5.3")\n implementation("com.google.zxing:javase:3.5.3") // للعمل مع BufferedImage\n}\nإذا كنت تكتب تطبيق خادم باستخدام Ktor أو Spring، فهذه التبعيات مناسبة. بالنسبة لنظام Android، يمكنك استخدام وحدة android-core، لكن في معظم الحالات تكون core كافية.
مولد رمز QR أساسي
\nلننشئ كلاس QRCodeGenerator الذي سيأخذ نصًا ويعيد صورة رمز QR على شكل BufferedImage.
import com.google.zxing.BarcodeFormat\nimport com.google.zxing.EncodeHintType\nimport com.google.zxing.qrcode.QRCodeWriter\nimport com.google.zxing.common.BitMatrix\nimport java.awt.image.BufferedImage\nimport java.util.*\n\nclass QRCodeGenerator {\n\n fun generateQRCode(text: String, width: Int = 300, height: Int = 300): BufferedImage {\n // إعداد الترميز ومستوى تصحيح الأخطاء\n val hints = EnumMap<EncodeHintType, Any>(EncodeHintType::class.java).apply {\n put(EncodeHintType.CHARACTER_SET, "UTF-8")\n put(EncodeHintType.ERROR_CORRECTION, com.google.zxing.qrcode.decoder.ErrorCorrectionLevel.H) // عالي\n put(EncodeHintType.MARGIN, 1) // الهوامش حول رمز QR\n }\n\n val writer = QRCodeWriter()\n val bitMatrix: BitMatrix = writer.encode(text, BarcodeFormat.QR_CODE, width, height, hints)\n\n // تحويل BitMatrix إلى BufferedImage\n val image = BufferedImage(width, height, BufferedImage.TYPE_INT_RGB)\n for (x in 0 until width) {\n for (y in 0 until height) {\n image.setRGB(x, y, if (bitMatrix.get(x, y)) 0xFF000000.toInt() else 0xFFFFFFFF.toInt())\n }\n }\n return image\n }\n}\nالشرح:
\n- \n
QRCodeWriter- كلاس ZXing المسؤول عن إنشاء مصفوفة النقاط. \n BitMatrix- مصفوفة ثنائية، حيثtrueتعني بكسل أسود. \n - نقوم بتعيين ترميز UTF-8 وأقصى مستوى لتصحيح الأخطاء (H - 30% تلف). \n
- يتم حفظ الصورة بتنسيق ARGB بنظام ألوان أبيض وأسود. \n
الحفظ في ملف (PNG)
\nلحفظ رمز QR المُنشأ في ملف، استخدم javax.imageio.ImageIO:
import java.io.File\nimport javax.imageio.ImageIO\n\nfun saveQRCodeToFile(text: String, filePath: String) {\n val generator = QRCodeGenerator()\n val image = generator.generateQRCode(text)\n val outputFile = File(filePath)\n ImageIO.write(image, "png", outputFile)\n println("تم حفظ رمز QR: ${outputFile.ab