این صفحه نحوه ثبت تصاویر با کیفیت بالا با CameraX را شرح میدهد. شما این کار را با کلاس ImageCapture و متدهای مرتبط با آن انجام میدهید.
مفاهیم کلیدی
مفاهیم اصلی مورد بحث در این سند به شرح زیر است:
- روش ذخیرهسازی : میتوانید تصاویر را یا در یک بافر درون حافظه یا مستقیماً در یک فایل ضبط کنید.
- اجراکنندهها :
ImageCaptureاز اجراکنندهها برای مدیریت فراخوانیهای برگشتی و عملیات ورودی/خروجی استفاده میکند. میتوانید این اجراکنندهها را برای عملکرد و کنترل بهتر سفارشی کنید. - حالتهای ضبط : میتوانید حالت ضبط را برای بهینهسازی تأخیر یا کیفیت تصویر پیکربندی کنید.
روش ذخیره سازی
دو راه برای گرفتن تصاویر با ImageCapture وجود دارد. هر دو از یک overload از ImageCapture.takePicture() استفاده میکنند:
فایل: از
takePicture(OutputFileOptions, Executor, OnImageSavedCallback)برای ذخیره مستقیم تصویر گرفته شده در یک فایل روی دیسک استفاده کنید.- این رایجترین روش برای گرفتن عکس است.
در حافظه: از
takePicture(Executor, OnImageCapturedCallback)برای دریافت یک بافر در حافظه از تصویر گرفته شده استفاده کنید.- این برای پردازش یا تحلیل تصویر در زمان واقعی مفید است.
مجریان
وقتی تابع takePicture فراخوانی میکنید، یک Executor و یک تابع OnImageCapturedCallback یا OnImageSavedCallback را ارسال میکنید. Executor تابع فراخوانی را اجرا میکند و هر گونه عملیات ورودی/خروجی (IO) حاصل را مدیریت میکند.
عکس بگیر
برای گرفتن عکس، دوربین را تنظیم میکنید و سپس تابع takePicture فراخوانی میکنید.
دوربین را تنظیم کنید
برای تنظیم دوربین، یک CameraProvider ایجاد کنید. سپس، یک شیء ImageCapture ایجاد کنید. از ImageCapture.Builder() استفاده کنید:
کاتلین
val imageCapture = ImageCapture.Builder()
.setTargetRotation(view.display.rotation)
.build()
cameraProvider.bindToLifecycle(lifecycleOwner, cameraSelector, imageCapture, preview)
جاوا
ImageCapture imageCapture =
new ImageCapture.Builder()
.setTargetRotation(view.getDisplay().getRotation())
.build();
cameraProvider.bindToLifecycle(lifecycleOwner, cameraSelector, imageCapture, preview);
عکس بگیر
پس از پیکربندی دوربین، تابع takePicture() را برای گرفتن تصویر فراخوانی کنید. این مثال نحوه استفاده از takePicture() را برای ذخیره تصویر در دیسک نشان میدهد:
کاتلین
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.
}
}
);
}
نکات کلیدی در مورد این قطعه کد به شرح زیر است:
- گزینه
ImageCapture.OutputFileOptionsبه شما امکان میدهد مکان ذخیره و ابرداده را پیکربندی کنید.- در اینجا، تابع
OutputFileOptions.Builder()از یک شیءFileبرای تعیین محل ذخیره استفاده میکند.
- در اینجا، تابع
- تابع
takePicture()با استفاده از گزینهها و اجراکنندهی ارائه شده، تصویر را به صورت غیرهمزمان ثبت میکند. -
OnImageSavedCallbackفراخوانیهای موفقیتآمیز و ناموفق را فراهم میکند.- تابع فراخوانی
onImageSaved()ثبت موفقیتآمیز تصویر را مدیریت میکند و دسترسی به نتایج تصویر ذخیرهشده را فراهم میکند. - تابع فراخوانی
onError()خطاهای ثبت تصویر را مدیریت میکند.
- تابع فراخوانی
گزینههای اضافی
برای روشهای بیشتر پیکربندی ImageCapture به راهنمای پیکربندی برای بهینهسازی، فلش و فرمت فایل مراجعه کنید.
منابع بیشتر
برای کسب اطلاعات بیشتر در مورد CameraX، به منابع زیر مراجعه کنید: