مولد رموز QR باستخدام Kotlin: مكتبة ZXing ونصائح التنفيذ

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مولد رموز QR باستخدام Kotlin مع ZXing

\n\n

أصبحت رموز QR (الاستجابة السريعة) جزءًا لا يتجزأ من العالم الرقمي الحديث. تُستخدم للتبادل السريع للروابط، بيانات الاتصال، كلمات مرور Wi-Fi ومعلومات أخرى. إذا كنت تطور تطبيقًا باستخدام Kotlin - سواء لنظام Android، أو للخادم (Ktor، Spring) أو لسطح المكتب (Compose Desktop) - فقد تحتاج إلى دمج وظيفة توليد رموز QR. في هذه المقالة، سنستعرض كيفية إنشاء مولد رموز QR بسيط وفعال باستخدام Kotlin، مع استخدام المكتبة الشهيرة ZXing (Zebra Crossing).

\n\n

لماذا ZXing؟

\n

ZXing هي مكتبة متعددة الوظائف لقراءة وكتابة الباركود ورموز QR. مكتوبة بلغة Java، مما يجعلها متوافقة تمامًا مع Kotlin. المزايا الرئيسية:

\n
    \n
  • دعم تنسيقات مختلفة: رمز QR، Data Matrix، Aztec، PDF417 وغيرها.
  • \n
  • أداء عالٍ وقابلية تخصيص عالية.
  • \n
  • مجتمع نشط وتحديثات منتظمة.
  • \n
  • سهولة التكامل مع مشاريع Kotlin.
  • \n
\n\n

إضافة المكتبة

\n

للبدء، أضف التبعية إلى ملف build.gradle.kts الخاص بك (إذا كنت تستخدم Gradle):

\n
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 كافية.

\n\n

مولد رمز QR أساسي

\n

لننشئ كلاس QRCodeGenerator الذي سيأخذ نصًا ويعيد صورة رمز QR على شكل BufferedImage.

\n
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
\n\n

الحفظ في ملف (PNG)

\n

لحفظ رمز QR المُنشأ في ملف، استخدم javax.imageio.ImageIO:

\n
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                    

توصيات