گرفتن تصویر

کیس استفاده ضبط تصویر برای ثبت عکس‌های با وضوح بالا و با کیفیت طراحی شده است و قابلیت‌های تعادل سفید خودکار، نوردهی خودکار و فوکوس خودکار (3A) را به اضافه کنترل‌های دستی دوربین ساده ارائه می‌کند. تماس گیرنده مسئول تصمیم گیری در مورد نحوه استفاده از تصویر گرفته شده، از جمله گزینه های زیر است:

دو نوع مجری قابل تنظیم وجود دارد که ImageCapture روی آنها اجرا می شود، مجری callback و اجرا کننده IO.

  • مجری callback پارامتر متدهای takePicture است. برای اجرای OnImageCapturedCallback() ارائه شده توسط کاربر استفاده می شود.
  • اگر تماس گیرنده تصمیم بگیرد که تصویر را در یک مکان فایل ذخیره کند، می توانید یک مجری را برای انجام IO مشخص کنید. برای تنظیم مجری IO، ImageCapture.Builder.setIoExecutor(Executor) را فراخوانی کنید. اگر اجرا کننده وجود نداشته باشد، CameraX به طور پیش‌فرض به یک مجری IO داخلی برای این کار تبدیل می‌شود.

تنظیم تصویربرداری

ضبط تصویر، کنترل‌های اساسی را برای عکس‌برداری فراهم می‌کند، مانند فلاش، فوکوس خودکار مداوم، تاخیر صفر شاتر و غیره.

setCaptureMode()

از ImageCapture.Builder.setCaptureMode() برای پیکربندی حالت عکاسی هنگام گرفتن عکس استفاده کنید:

حالت ضبط پیش‌فرض 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() برای تعیین اینکه آیا دستگاه شما شرایط زیر را دارد یا خیر استفاده کنید:

برای دستگاه‌هایی که حداقل شرایط لازم را ندارند، 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، به منابع اضافی زیر مراجعه کنید.

Codelab

  • شروع کار با CameraX
  • نمونه کد

  • نمونه برنامه های CameraX