Barcode Scanning هي تقنية لقراءة وفك تشفير الباركود باستخدام كاميرا الجهاز المحمول. على عكس الماسحات الضوئية الليزرية التي تتطلب معدات متخصصة، تعمل الماسحات الضوئية بالكاميرا على أي هاتف ذكي مزود بكاميرا. في تطوير التطبيقات المحمولة، يتم تنفيذ Barcode Scanning عبر ML Kit Barcode Scanning (Google) أو AVFoundation (Apple) أو ZXing (مفتوح المصدر) أو Scandit (SDK تجاري). وفقاً Google ML Kit, 2025، تعالج المكتبة أكثر من 2 مليار عملية مسح يومياً بدقة 98.5%.
أهم النقاط
Barcode Scanning هي عملية التعرف البصري على الباركود باستخدام الكاميرا. تلتقط الخوارزمية صورة، وتجد الرمز (التحديد)، وتفك تشفيره (استخراج البيانات) وتعيد قيمة نصية. تمسح SDKs الحديثة الرموز بأي اتجاه وحجم وإضاءة — يحتاج المستخدم فقط إلى توجيه الكاميرا.
تنسيقات الباركود تنقسم إلى مجموعتين: 1D (خطية) — EAN-13, UPC-A, Code 128, Code 39, ITF, Codabar — تحتوي على 20–30 حرفاً، تستخدم للمنتجات والخدمات اللوجستية؛ 2D (مصفوفية) — QR Code, Data Matrix, PDF417, Aztec — تحتوي على أكثر من 3000 حرف، تستخدم للروابط والتذاكر والوثائق. يدعم ML Kit 14 تنسيقاً — جميع التنسيقات الشائعة 1D و 2D.
Data Matrix هو رمز 2D يشبه QR ولكنه أكثر Compactness. يُستخدم في الصناعة (وضع علامات على القطع)، والتذاكر الإلكترونية (IATA BCBP)، والعينات الطبية. يمكن لـ Data Matrix احتواء ما يصل إلى 2335 حرفاً ويُطبع على أسطح صغيرة جداً — حتى 2x2 مم. على عكس QR، لا يحتوي Data Matrix على أنماط تحديد (مربعات في الزوايا) ويتطلب معايرة كاميرا أكثر دقة.
| التنسيق | النوع | البيانات القصوى | التطبيق |
|---|---|---|---|
| EAN-13 | 1D | 13 رقماً | منتجات التجزئة |
| QR Code | 2D | 4296 حرفاً | روابط، مدفوعات، تذاكر |
| Data Matrix | 2D | 2335 حرفاً | الصناعة، الطب |
| PDF417 | 2D | 2710 حرفاً | وثائق، بطاقات صعود |
| Code 128 | 1D | 80 حرفاً | اللوجستية، النقل |
QR Code هو أكثر التنسيقات ثنائية الأبعاد شيوعاً في التطبيقات المحمولة. يحتوي على URL ونص و vCard وتكوين WiFi ومعلومات الدفع (UPI, SBP). يحتوي QR Code على 40 إصداراً (من 21x21 إلى 177x177 وحدة) و 4 مستويات لتصحيح الأخطاء (L: 7%, M: 15%, Q: 25%, H: 30%). للتطبيقات المحمولة استخدم الإصدار 2–10 (25x25 – 57x57 وحدة) — التوازن الأمثل بين الحجم والبيانات.
ML Kit Barcode Scanning هو SDK الرئيسي لتطبيقات Android. يجد ML Kit تلقائياً جميع الرموز في الصورة (على عكس ZXing الذي يتطلب أن يكون الرمز في المنتصف). تعيد API كائن Barcode مع rawValue (المحتوى النصي)، format (نوع الرمز)، boundingBox و cornerPoints (4 نقاط زوايا الرمز). يدعم MLKit المسح الفردي (single-scan) والمسح المستمر (continuous-scan).
الوضع متعدد الرموز — يمكن لـ ML Kit اكتشاف رموز متعددة في صورة واحدة. فعّله عبر BarcodeScannerOptions.Builder(). في الوضع المتعدد، يتم إرجاع قائمة Barcodes. استخدمه للمخزون (مسح دفعات المنتجات)، والتعرف على رموز QR متعددة على طاولة. الوضع متعدد الرموز معطل افتراضياً — فعّله فقط إذا لزم الأمر لأنه يبطئ المسح بنسبة 20–30%.
// ML Kit Barcode Scanning multi-code mode
val options = BarcodeScannerOptions.Builder()
.setBarcodeFormats(
Barcode.FORMAT_QR_CODE,
Barcode.FORMAT_EAN_13,
Barcode.FORMAT_DATA_MATRIX
)
.enableAllPotentialBarcodes()
.build()
val scanner = BarcodeScanning.getClient(options)
scanner.process(inputImage)
.addOnSuccessListener { barcodes ->
barcodes.forEach { barcode ->
val type = barcode.valueType // URL, TEXT, PHONE...
val rawValue = barcode.rawValue
val displayValue = barcode.displayValue
}
}
تصفية التنسيقات — تحسين إلزامي. يحدّد setBarcodeFormats() التنسيقات التي سيبحث عنها ML Kit. إذا كان التطبيق يمسح رموز QR فقط — حدد FORMAT_QR_CODE. هذا يسرّع المسح بمقدار 2–3 مرات باستبعاد خوارزميات فك تشفير التنسيقات الأخرى. لماسحات التجزئة — FORMAT_EAN_13 | FORMAT_UPC_A. للوجستيات — FORMAT_CODE_128 | FORMAT_CODE_39 | FORMAT_PDF417.
ZXing (Zebra Crossing) هي مكتبة مفتوحة المصدر بلغة Java (Android) مع إصدارات لـ Swift و React Native و Flutter. كانت ZXing المعيار الفعلي للمسح قبل ظهور ML Kit. تدعم جميع التنسيقات الشائعة، وتعمل على أي جهاز (بما في ذلك Huawei بدون Google Play)، ولا تتطلب Google Play Services. العيوب: أبطأ 2–3 مرات من ML Kit، لا تجد الرموز على أطراف الإطار، لا يوجد وضع متعدد الرموز.
ML Kit vs ZXing — يتفوق ML Kit في السرعة والدقة وتجربة المستخدم. يكتشف ML Kit الرمز حتى لو كان يشغل 10% من الإطار وفي الزاوية. يتطلب ZXing أن يشغل الرمز 50–80% من الإطار وأن يكون في المنتصف. يستخدم ML Kit شبكة عصبية (MobileNetV2-SSD) لتحديد موقع الرمز، بينما يستخدم ZXing التثبيت التقليدي والبحث عن أنماط التحديد. وفقاً لـ Google (2025)، يحقق ML Kit دقة 98.5% مقابل 92% لـ ZXing.
| الخاصية | ML Kit | ZXing |
|---|---|---|
| الدقة | 98.5% | 92% |
| السرعة | 15–30 مللي ثانية | 50–150 مللي ثانية |
| متعدد الرموز | نعم | لا |
| Google Play | مطلوب | غير مطلوب |
| رمز في الزاوية | يكتشف | لا يكتشف |
متى تختار ZXing: إذا كان التطبيق يجب أن يعمل على أجهزة Huawei (بدون Google Play Services)، أو على Android Go (ذاكرة محدودة)، أو إذا كانت هناك حاجة لتشغيل كامل بدون اتصال بالإنترنت دون Play Services. في جميع الحالات الأخرى — ML Kit أسرع وأكثر دقة وأسهل في التكامل ويوفر تجربة مستخدم أفضل بفضل تعدد الرموز والكشف على الأطراف.
// ZXing Core: simple scanner
val reader = MultiFormatReader()
val bitmap = BitmapFactory.decodeResource(resources, R.drawable.test)
val source = RGBLuminanceSource(bitmap)
val binarizer = HybridBinarizer(source)
val binaryBitmap = BinaryBitmap(binarizer)
try {
val result = reader.decode(binaryBitmap)
Log.d("ZXing", result.text)
} catch (e: NotFoundException) {
// Code not found
}
Scandit كبديل — SDK تجاري بدقة 99.5% وسرعة 10–20 مللي ثانية. يستخدم شبكات عصبية خاصة ولا يتطلب Google Play Services. السعر — من 400 دولار/شهر (2019). يهيمن Scandit في التجزئة والخدمات اللوجستية (Walmart, FedEx). لمعظم التطبيقات المحمولة، ML Kit كافٍ — Scandit مبرر فقط لمهام المؤسسات ذات المسح عالي الحجم.
Apple AVFoundation يوفر Barcode Scanning أصلياً عبر AVCaptureMetadataOutput. منذ iOS 7، يدعم AVFoundation مسح رموز QR، ومنذ iOS 8 — جميع التنسيقات EAN, UPC, Code 128, PDF417. لا يتطلب AVFoundation تثبيت SDK إضافية — إنه جزء من Foundation. يعمل المسح عبر Apple Neural Engine على A12+ — سرعة 10–20 مللي ثانية مع استهلاك طاقة ضئيل.
مزايا AVFoundation: عدم وجود تبعيات، معالجة تلقائية لاتجاه الكاميرا، دعم مدمج للوضع الفاتح/الداكن، العمل في الخلفية (مع background modes). يضبط AVFoundation تلقائياً التركيز البؤري والتعريض للمسح — يحتاج المطور فقط إلى الاشتراك في مفوض captureOutput. العيب: إعدادات أقل من ML Kit — لا يمكن تفعيل الوضع متعدد الرموز أو تصفية التنسيقات.
import AVFoundation
class BarcodeScannerController: UIViewController, AVCaptureMetadataOutputObjectsDelegate {
private var captureSession: AVCaptureSession!
override func viewDidLoad() {
let metadataOutput = AVCaptureMetadataOutput()
captureSession.addOutput(metadataOutput)
metadataOutput.setMetadataObjectsDelegate(self, queue: .main)
metadataOutput.metadataObjectTypes = [.qr, .ean13, .code128]
}
func metadataOutput(_ output: AVCaptureMetadataOutput,
didOutput objects: [AVMetadataObject],
from connection: AVCaptureConnection) {
guard let code = objects.first as? AVMetadataMachineReadableCodeObject else { return }
print(code.stringValue ?? "")
}
}
ML Kit vs AVFoundation على iOS: يمنح ML Kit تحكماً أكبر — يمكنك تكوين التنسيقات، وتفعيل الوضع متعدد الرموز، وتصفية الرموز حسب الثقة. AVFoundation أسرع على الأجهزة القديمة (نفقات عامة أقل)، لكنه لا يدعم Data Matrix و Aztec و PDF417 على iOS < 15. لـ iOS 15+ يفضل ML Kit. لـ iOS 12–14 استخدم AVFoundation + الرجوع إلى ML Kit للتنسيقات غير المدعومة.
Scandit هو SDK تجاري لـ Barcode Scanning يركز على التجزئة والخدمات اللوجستية والرعاية الصحية. يستخدم Scandit شبكات عصبية خاصة مدربة على أكثر من 10 ملايين صورة باركود في ظروف مختلفة: الوهج، التلف، الإضاءة المنخفضة، الإمالة حتى 45 درجة، الانعكاسات. يمسح Scandit الرموز على مسافات تصل إلى 15 متراً (لـ PDF417 في المستودعات) وعلى الأسطح المنحنية (العلب، الزجاجات).
ميزات Scandit: SparkScan (مسح فردي للمسح التسلسلي السريع)، MatrixScan (متعدد الرموز + إضاءة AR للعناصر الممسوحة)، PickList (البحث عن منتج بالباركود مع التأكيد). يدعم Scandit أكثر من 50 تنسيقاً، بما في ذلك GS1 DataBar و Composite Codes. السرعة — 10–15 مللي ثانية للرمز الواحد. الدقة — 99.5% في الإضاءة القياسية، 97% في الإضاءة الضعيفة.
// Scandit MatrixScan (SDK license required)
val barcodeTracking = BarcodeTracking
.forDataCaptureContext(context)
.addListener(this)
.build()
barcodeTracking.addSessionListener { session, _ ->
session.trackedBarcodes.forEach { (trackingId, barcode) ->
val data = barcode.data
val symbolCount = barcode.symbolCount
}
}
Scandit vs ML Kit: Scandit مدفوع (أكثر من 400 دولار/شهر)، لكنه يوفر ميزات مؤسسية: SparkScan (زر أجهزة على الأجهزة المؤسسية)، MatrixScan (تراكب AR للإضاءة)، PickList (تأكيد صوتي). ML Kit مجاني ويكفي لـ 90% من التطبيقات المحمولة: ماسحات المتاجر، وقارئات QR، وتطبيقات التذاكر. Scandit مبرر فقط لمحطات الخدمات اللوجستية بأجهزة Zebra/Honeywell.
تحسين Barcode Scanning يشمل إعدادات الكاميرا والدقة وSDK. القاعدة الرئيسية: بكسلات أقل — مسح أسرع. لـ ML Kit الدقة المثلى هي 480p (640x480) للفيديو و 720p (1280x720) للصور. الزيادة إلى 1080p تبطئ المعالجة 2–3 مرات دون تحسين الدقة. استخدم CameraX مع ImageAnalysis للإدارة التلقائية للدقة.
التركيز البؤري والتعريض ضروريان لجودة المسح. لا يضبط ML Kit الكاميرا تلقائياً — يجب على المطور تفعيل التركيز البؤري التلقائي المستمر والتعريض التلقائي المستمر عبر Camera2 أو CameraX. بدون تركيز بؤري تلقائي، تقلل الرموز الضبابية الدقة إلى 60–70%. للمسح عن قرب (5–15 سم) استخدم الوضع الكلي (macro) للكاميرا إذا كان متاحاً.
التقريب التلقائي وتراكب المحدد — تحسينات تجربة المستخدم. يقوم التقريب التلقائي بتكبير الرمز عند اكتشافه (كما في كاميرا Google Lens). يُنفَّذ عبر تحليل boundingBox للرمز وتغيير حجم المعاينة. تراكب المحدد هو إطار رسومي يوضح أين توجّه الكاميرا. لتجربة مستخدم أفضل، أظهر boundingBox للرمز الموجود وميّزه بالأخضر عند فك التشفير بنجاح.
// CameraX + ML Kit: optimized scanner
class BarcodeAnalyzer(private val scanner: BarcodeScanner) :
ImageAnalysis.Analyzer {
override fun analyze(image: ImageProxy) {
if (image.image == null) { image.close(); return }
val mediaImage = InputImage.fromMediaImage(image.image, image.imageInfo.rotationDegrees)
scanner.process(mediaImage)
.addOnSuccessListener { barcodes ->
barcodes.firstOrNull()?.let {
// Haptic + sound + code highlight
}
}
.addOnCompleteListener { image.close() }
}
}
ردود الفعل للمستخدم: الاهتزاز (HapticFeedback)، الصوت (MediaActionSound)، الإضاءة المرئية (Canvas/Overlay). بعد مسح ناجح، أضف تأخيراً من 1000–1500 مللي ثانية (الحد) قبل المسح التالي — هذا يمنع التكرار على نفس الرمز. للمسح التسلسلي (مسح الدفعات) استخدم نهج SparkScan: يتم تسجيل كل مسح والإعلان عنه، مع تأخير 300–500 مللي ثانية.
الأسئلة الشائعة
ML Kit Barcode Scanning هو أفضل خيار لـ Android: مجاني، دقة 98.5%، متعدد الرموز، كشف في أي جزء من الإطار. إذا كان التطبيق يجب أن يعمل على أجهزة Huawei بدون Google Play — استخدم ZXing (مفتوح المصدر، دقة أقل). للخدمات اللوجستية المؤسسية — Scandit (مدفوع، دقة 99.5%, SparkScan). لقارئ QR بسيط، ZXing أو ML Kit كافيان.
يدعم ML Kit Barcode Scanning 14 تنسيقاً: 1D — EAN-8, EAN-13, UPC-A, UPC-E, Code 39, Code 93, Code 128, ITF, Codabar; 2D — QR Code, Data Matrix, PDF417, Aztec. كما يدعم GS1 DataBar (RSS-14, RSS-Expanded). القائمة الكاملة في توثيق Barcode.FORMAT_*. لتحديد التنسيقات استخدم setBarcodeFormats() — هذا يسرع المسح 2–3 مرات.
اخفض دقة الكاميرا إلى 480p (640x480)، فعّل التركيز البؤري التلقائي المستمر، حدد التنسيقات المطلوبة فقط (setBarcodeFormats)، استخدم وضع الأداء FAST. لـ ML Kit حدد فقط التنسيقات الضرورية — استبعاد التنسيقات الإضافية يسرع المسح 2–3 مرات. لـ ZXing — استخدم HybridBinarizer بدلاً من GlobalHistogramBinarizer (أسرع بنسبة 20%). لـ AVFoundation — حدد metadataObjectTypes.
نعم، جميع SDKs المحلية لـ Barcode Scanning (ML Kit, ZXing, AVFoundation, Scandit) تعمل بدون إنترنت تماماً. يحتاج ML Kit إلى الإنترنت فقط للتنزيل الأولي للنموذج (وضع التنزيل)، وبعد ذلك يتم تخزين النموذج مؤقتاً على الجهاز. AVFoundation مدمج في iOS، ولا يحتاج إلى إنترنت. ZXing يعمل بدون إنترنت تماماً دون Play Services. المسح السحابي (Google Cloud Vision) لا يُستخدم في التطبيقات المحمولة.
يمتلك ML Kit و Scandit تصحيحاً مدمجاً للرموز التالفة بفضل خوارزميات الشبكات العصبية. يستعيد ML Kit ما يصل إلى 30% من الرمز التالف (الخدوش، التمزقات). Scandit — حتى 50% بفضل التدريب على الرموز المعيبة. لا يستعيد ZXing الرموز التالفة تقريباً — يتطلب صورة واضحة. لمسح الرموز المعيبة استخدم Scandit أو ML Kit مع وضع الأداء ACCURATE.
الخلاصة
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.