التقاط الصور

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

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

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

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

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

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() لتحديد ما إذا كان جهازك يستوفي المتطلبات التالية:

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

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

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

تفعيل ميزة "التأخير بدون غالق"

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

setFlashMode()

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

  • FLASH_MODE_ON: يكون Flash قيد التشغيل دائمًا.
  • 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 إلى نموذج RGB Bitmap، يمكنك الاطّلاع على YuvToRgbConverter.kt.

مراجع إضافية

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

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

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

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