کیس استفاده ضبط تصویر برای ثبت عکسهای با وضوح بالا و با کیفیت طراحی شده است و قابلیتهای تعادل سفید خودکار، نوردهی خودکار و فوکوس خودکار (3A) را به اضافه کنترلهای دستی دوربین ساده ارائه میکند. تماس گیرنده مسئول تصمیم گیری در مورد نحوه استفاده از تصویر گرفته شده، از جمله گزینه های زیر است:
-
takePicture(Executor, OnImageCapturedCallback)
: این روش یک بافر در حافظه تصویر گرفته شده را فراهم می کند. -
takePicture(OutputFileOptions, Executor, OnImageSavedCallback)
: این روش تصویر گرفته شده را در محل فایل ارائه شده ذخیره می کند.
دو نوع مجری قابل تنظیم وجود دارد که ImageCapture
روی آنها اجرا می شود، مجری callback و اجرا کننده IO.
- مجری callback پارامتر متدهای
takePicture
است. برای اجرایOnImageCapturedCallback()
ارائه شده توسط کاربر استفاده می شود. - اگر تماس گیرنده تصمیم بگیرد که تصویر را در یک مکان فایل ذخیره کند، می توانید یک مجری را برای انجام IO مشخص کنید. برای تنظیم مجری IO،
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
) به عنوان حالت تصویربرداری در دسترس است. با فعال کردن Zero-Shutter Lag، تأخیر در مقایسه با حالت پیشفرض عکسبرداری، CAPTURE_MODE_MINIMIZE_LATENCY
، به طور قابل توجهی کاهش مییابد، به طوری که هرگز عکس را از دست ندهید.
Zero-Shutter Lag از بافر حلقه ای استفاده می کند که سه فریم جدیدترین عکس را ذخیره می کند. هنگامی که کاربر دکمه ضبط را فشار میدهد، CameraX takePicture()
را فراخوانی میکند و بافر حلقه فریم گرفته شده را با مهر زمانی که نزدیکترین زمان به فشار دکمه است بازیابی میکند. سپس CameraX جلسه عکسبرداری را مجدداً پردازش می کند تا تصویری از آن فریم تولید کند که با فرمت JPEG در دیسک ذخیره می شود.
پیش نیازها
قبل از فعال کردن Zero-Shutter Lag، از isZslSupported()
برای تعیین اینکه آیا دستگاه شما شرایط زیر را دارد یا خیر استفاده کنید:
- Android 6.0+ (سطح API 23 و بالاتر) را هدف قرار می دهد.
- از پردازش مجدد
PRIVATE
پشتیبانی می کند.
برای دستگاههایی که حداقل شرایط لازم را ندارند، CameraX به CAPTURE_MODE_MINIMIZE_LATENCY
برمیگردد.
Zero-Shutter Lag فقط برای حالت استفاده از تصویربرداری در دسترس است. نمیتوانید آن را برای حالت استفاده از فیلمبرداری یا با پسوندهای دوربین فعال کنید. در نهایت، از آنجایی که استفاده از فلاش باعث تاخیر بیشتر می شود، زمانی که فلاش روشن یا در حالت خودکار است، تاخیر صفر شاتر کار نمی کند. برای اطلاعات بیشتر در مورد تنظیم حالت فلاش، به setFlashMode()
مراجعه کنید.
Zero-Shutter Lag را فعال کنید
برای فعال کردن Zero-Shutter Lag، 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
: فلاش به طور خودکار برای عکسهایی در نور کم روشن میشود.
عکس بگیرید
نمونه کد زیر نحوه پیکربندی برنامه خود را برای گرفتن عکس نشان می دهد:
کاتلین
val imageCapture = ImageCapture.Builder() .setTargetRotation(view.display.rotation) .build() cameraProvider.bindToLifecycle(lifecycleOwner, cameraSelector, imageCapture, imageAnalysis, preview)
جاوا
ImageCapture imageCapture = new ImageCapture.Builder() .setTargetRotation(view.getDisplay().getRotation()) .build(); cameraProvider.bindToLifecycle(lifecycleOwner, cameraSelector, imageCapture, imageAnalysis, preview);
توجه داشته باشید که bindToLifecycle()
یک شی Camera
را برمی گرداند. برای اطلاعات بیشتر در مورد کنترل خروجی دوربین، مانند زوم و نوردهی، به این راهنما مراجعه کنید.
هنگامی که دوربین را پیکربندی کردید، کد زیر بر اساس عملکرد کاربر عکس می گیرد:
کاتلین
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. } }) }
جاوا
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، به منابع اضافی زیر مراجعه کنید.