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