تم تصميم حالة استخدام التقاط الصور لالتقاط صور عالية الدقة وعالية الجودة، كما توفّر وظائف توازن اللون الأبيض تلقائيًا، والتعرّض التلقائي للضوء، والتركيز التلقائي (3A)، بالإضافة إلى عناصر تحكم يدوية بسيطة في الكاميرا. يكون المتصل مسؤولاً عن تحديد كيفية استخدام الصورة الملتقطة، بما في ذلك الخيارات التالية:
takePicture(Executor, OnImageCapturedCallback)
: توفِّر هذه الطريقة موردًا احتياطيًا في الذاكرة للصورة التي تم التقاطها.takePicture(OutputFileOptions, Executor, OnImageSavedCallback)
: تحفظ هذه الطريقة الصورة التي تم التقاطها في موقع الملف المقدَّم.
هناك نوعان من أدوات التنفيذ القابلة للتخصيص التي يتم من خلالها تشغيل ImageCapture
، هما: تنفيذ معاودة الاتصال ومسؤول تنفيذ IO.
- منفذ رد الاتصال هو معلَمة طرق
takePicture
. وتُستخدَم لتنفيذOnImageCapturedCallback()
التي يقدّمها المستخدم. - إذا اختار المتصل حفظ الصورة في موقع ملف، يمكنك تحديد
منفذ لتنفيذ طلب الإدراج. لضبط الجهاز التنفيذي لعملية الإدخال، يُرجى الاتصال بالرقم
ImageCapture.Builder.setIoExecutor(Executor)
. في حال غياب المُنفذ، سيتم ضبط CameraX بشكل افتراضي إلى منفذ IO الداخلي للمهمة.
إعداد التقاط الصور
يوفر التقاط الصور عناصر تحكم أساسية لالتقاط الصور، مثل الفلاش، والتركيز التلقائي المستمر، والتأخير في التقاط الصور، وغيرها.
setCaptureMode()
استخدِم ImageCapture.Builder.setCaptureMode()
لضبط وضع الالتقاط عند التقاط صورة:
CAPTURE_MODE_MINIMIZE_LATENCY
: تحسين عملية التقاط الصور لملاءمة وقت الاستجابةCAPTURE_MODE_MAXIMIZE_QUALITY
: تحسين جودة التقاط الصور
يكون وضع الالتقاط تلقائيًا هو 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، يُرجى الرجوع إلى الموارد الإضافية التالية.
درس تطبيقي حول الترميز
عيّنة تعليمات برمجية