التقاط الصور

تم تصميم حالة استخدام التقاط الصور لالتقاط صور عالية الدقة، صور عالية الجودة وتوفير توازن اللون الأبيض التلقائي والتعرض التلقائي للضوء وظيفة التركيز التلقائي (3A)، بالإضافة إلى عناصر التحكم اليدوية البسيطة في الكاميرا. المتصل مسؤول عن تحديد كيفية استخدام الصورة التي تم التقاطها، بما في ذلك الخيارات التالية:

هناك نوعان من برامج التنفيذ القابلة للتخصيص التي يتم تشغيل ImageCapture عليها، وهما: مسؤول معاودة الاتصال ومسؤول تنفيذ الإدراجات.

  • عنصر تنفيذ معاودة الاتصال هو مَعلمة طرق takePicture. من المهم تُستخدم لتنفيذ OnImageCapturedCallback() المقدّمة من المستخدم.
  • إذا اختار المتصل حفظ الصورة في موقع الملف، يمكنك تحديد والمنفذ لإجراء طلب الإدراج. لضبط تنفيذ طلب الإدراج، اطلب ImageCapture.Builder.setIoExecutor(Executor) في حال عدم توفّر جهة التنفيذ، سيتم ضبط تطبيق CameraX تلقائيًا على منفذ طلب الإدراج الداخلي. للمهمة.

إعداد التقاط الصور

يوفر التقاط الصور عناصر التحكم الأساسية لالتقاط الصور، مثل الفلاش والتركيز التلقائي المستمر والتأخير بدون انقطاع وغير ذلك.

setCaptureMode()

استخدام ImageCapture.Builder.setCaptureMode() لضبط وضع الالتقاط عند التقاط صورة:

يكون وضع الالتقاط التلقائي هو CAPTURE_MODE_MINIMIZE_LATENCY. لمزيد من المعلومات، اطّلِع على المستندات المرجعية لبرامج setCaptureMode().

عدم التأخر في قفل الباب

بدءًا من الإصدار 1.2، يصبح الفاصل الزمني بدون غالق (CAPTURE_MODE_ZERO_SHOT_LAG) متاحًا كوضع التقاط. عند تفعيل "التصوير البطيء"، يتم تقليل وقت الاستجابة بشكل كبير مقارنةً بوضع الالتقاط التلقائي CAPTURE_MODE_MINIMIZE_LATENCY، بحيث لا تفوتك أي لقطة.

يستخدم الفاصل الزمني بدون انقطاع مخزنًا مؤقتًا يخزِّن أحدث ثلاثة إطارات لالتقاط الصور. عندما يضغط المستخدم على زر الالتقاط، يستدعي CameraX رمز takePicture()، وتسترد المخزن المؤقت الدائري الإطار الذي تم التقاطه بالطابع الزمني الأقرب إلى الطابع الزمني عند الضغط على الزر. بعد ذلك، يعيد CameraX معالجة جلسة الالتقاط لإنشاء صورة من ذلك الإطار، ويتم حفظها على القرص بتنسيق JPEG.

المتطلّبات الأساسية

قبل تفعيل "الفاصل الزمني بدون غالق"، استخدِم isZslSupported() لتحديد ما إذا كان جهازك يستوفي المتطلبات التالية:

  • يتم استهداف الإصدار 6.0 من نظام التشغيل Android والإصدارات الأحدث (المستوى 23 من واجهة برمجة التطبيقات والإصدارات الأحدث).
  • تتيح إعادة معالجة ملفات PRIVATE.

بالنسبة إلى الأجهزة التي لا تستوفي الحد الأدنى من المتطلبات، يعود تطبيق CameraX إلى CAPTURE_MODE_MINIMIZE_LATENCY.

لا يتوفر أي تأخر في تثبيت الكاميرا إلا في حالة استخدام التقاط الصور. لا يمكنك تفعيل هذه الميزة لالتقاط الفيديو حالة الاستخدام أو مع إضافات الكاميرا. وأخيرًا، نظرًا لأن استخدام الفلاش يؤدي إلى وقت استجابة أكبر، لا يعمل "الفاصل الزمني بدون غالق" عندما يكون الفلاش "مفعَّل" أو في الوضع "تلقائي". لمزيد من المعلومات حول ضبط وضع الفلاش، يمكنك الاطّلاع على setFlashMode().

تفعيل الفاصل الإعلاني بدون توقّف

لتفعيل وضع "الفاصل الزمني بدون غالق"، مرِّر CAPTURE_MODE_ZERO_SHOT_LAG إلى ImageCapture.Builder.setCaptureMode(). وفي حال عدم نجاح هذه العملية، سيتم خفض setCaptureMode() إلى CAPTURE_MODE_MINIMIZE_LATENCY.

setFlashMode()

وضع الفلاش التلقائي هو FLASH_MODE_OFF. لضبط وضع الفلاش، استخدِم ImageCapture.Builder.setFlashMode():

  • FLASH_MODE_ON: يكون الفلاش قيد التشغيل دائمًا.
  • FLASH_MODE_AUTO: يتم تفعيل الفلاش تلقائيًا في اللقطات ذات الإضاءة المنخفضة.

التقاط صورة

يعرض نموذج الرمز البرمجي التالي كيفية ضبط تطبيقك لالتقاط صورة:

Kotlin

val imageCapture = ImageCapture.Builder()
    .setTargetRotation(view.display.rotation)
    .build()

cameraProvider.bindToLifecycle(lifecycleOwner, cameraSelector, imageCapture,
    imageAnalysis, preview)

Java

ImageCapture imageCapture =
    new ImageCapture.Builder()
        .setTargetRotation(view.getDisplay().getRotation())
        .build();

cameraProvider.bindToLifecycle(lifecycleOwner, cameraSelector, imageCapture, imageAnalysis, preview);

يُرجى العِلم أنّ bindToLifecycle() تعرض الكائن Camera. راجِع هذا الدليل للحصول على مزيد من المعلومات حول التحكّم في إخراج الكاميرا، مثل التكبير أو التصغير والتعرض للضوء.

بعد تهيئة الكاميرا، يلتقط الرمز التالي صورة استنادًا إلى إجراء المستخدم:

Kotlin

fun onClick() {
    val outputFileOptions = ImageCapture.OutputFileOptions.Builder(File(...)).build()
    imageCapture.takePicture(outputFileOptions, cameraExecutor,
        object : ImageCapture.OnImageSavedCallback {
            override fun onError(error: ImageCaptureException)
            {
                // insert your code here.
            }
            override fun onImageSaved(outputFileResults: ImageCapture.OutputFileResults) {
                // insert your code here.
            }
        })
}

Java

public void onClick() {
    ImageCapture.OutputFileOptions outputFileOptions =
            new ImageCapture.OutputFileOptions.Builder(new File(...)).build();
    imageCapture.takePicture(outputFileOptions, cameraExecutor,
        new ImageCapture.OnImageSavedCallback() {
            @Override
            public void onImageSaved(ImageCapture.OutputFileResults outputFileResults) {
                // insert your code here.
            }
            @Override
            public void onError(ImageCaptureException error) {
                // insert your code here.
            }
       }
    );
}

تدعم طريقة التقاط الصور بشكل كامل JPEG. لنموذج الرمز البرمجي توضّح كيفية تحويل Media.Image كائن من تنسيق YUV_420_888 إلى نموذج أحمر أخضر أزرق الكائن Bitmap، الاطّلاع على YuvToRgbConverter.kt.

مصادر إضافية

للتعرف على مزيد من المعلومات حول CameraX، يمكنك الرجوع إلى الموارد الإضافية التالية.

درس تطبيقي حول الترميز

  • بدء استخدام CameraX
  • نموذج التعليمات البرمجية

  • نماذج تطبيقات CameraX