ইমেজ ক্যাপচার

ইমেজ ক্যাপচার ব্যবহারের কেসটি উচ্চ-রেজোলিউশন, উচ্চ-মানের ছবি তোলার জন্য ডিজাইন করা হয়েছে এবং সাধারণ ম্যানুয়াল ক্যামেরা নিয়ন্ত্রণ ছাড়াও অটো-হোয়াইট-ব্যালেন্স, অটো-এক্সপোজার এবং অটো-ফোকাস (3A) কার্যকারিতা প্রদান করে। নিম্নলিখিত বিকল্পগুলি সহ ক্যাপচার করা ছবি কীভাবে ব্যবহার করবেন তা সিদ্ধান্ত নেওয়ার জন্য কলকারী দায়ী:

দুটি ধরণের কাস্টমাইজযোগ্য নির্বাহক রয়েছে যার উপর ImageCapture চলে, কলব্যাক নির্বাহক এবং আইও নির্বাহক।

  • কলব্যাক নির্বাহক হল takePicture পদ্ধতির প্যারামিটার। এটি ব্যবহারকারী দ্বারা প্রদত্ত OnImageCapturedCallback() কার্যকর করতে ব্যবহৃত হয়।
  • যদি কলকারী একটি ফাইল অবস্থানে ছবিটি সংরক্ষণ করতে পছন্দ করে, আপনি IO করার জন্য একজন নির্বাহককে নির্দিষ্ট করতে পারেন। IO নির্বাহক সেট করতে, ImageCapture.Builder.setIoExecutor(Executor) কল করুন। নির্বাহক অনুপস্থিত থাকলে, CameraX কার্যটির জন্য একটি অভ্যন্তরীণ IO নির্বাহককে ডিফল্ট করবে।

ইমেজ ক্যাপচার সেট আপ করুন

ইমেজ ক্যাপচার ছবি তোলার জন্য মৌলিক নিয়ন্ত্রণ প্রদান করে, যেমন ফ্ল্যাশ, একটানা অটো-ফোকাস, জিরো-শাটার ল্যাগ এবং আরও অনেক কিছু।

সেটক্যাপচারমোড()

ছবি তোলার সময় ক্যাপচার মোড কনফিগার করতে 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() আহ্বান করে, এবং রিং বাফার টাইমস্ট্যাম্প সহ ক্যাপচার করা ফ্রেমটি পুনরুদ্ধার করে যা বোতাম প্রেসের সবচেয়ে কাছাকাছি। ক্যামেরাএক্স তারপর সেই ফ্রেম থেকে একটি চিত্র তৈরি করতে ক্যাপচার সেশনটি পুনরায় প্রক্রিয়া করে , যা JPEG ফর্ম্যাটে ডিস্কে সংরক্ষিত হয়।

পূর্বশর্ত

জিরো-শাটার ল্যাগ সক্ষম করার আগে, আপনার ডিভাইস নিম্নলিখিত প্রয়োজনীয়তাগুলি পূরণ করে কিনা তা নির্ধারণ করতে isZslSupported() ব্যবহার করুন:

ন্যূনতম প্রয়োজনীয়তাগুলি পূরণ করে না এমন ডিভাইসগুলির জন্য, CameraX CAPTURE_MODE_MINIMIZE_LATENCY এ ফিরে আসে৷

জিরো-শাটার ল্যাগ শুধুমাত্র ইমেজ ক্যাপচার ব্যবহারের ক্ষেত্রে উপলব্ধ। আপনি ভিডিও ক্যাপচার ব্যবহারের ক্ষেত্রে বা ক্যামেরা এক্সটেনশনগুলির জন্য এটি সক্ষম করতে পারবেন না৷ পরিশেষে, যেহেতু ফ্ল্যাশ ব্যবহার করার ফলে অধিকতর বিলম্বিত হয়, ফ্ল্যাশ চালু বা অটো মোডে জিরো-শাটার ল্যাগ কাজ করে না। ফ্ল্যাশ মোড সেট করার বিষয়ে আরও তথ্যের জন্য, setFlashMode() দেখুন।

জিরো-শাটার ল্যাগ সক্ষম করুন

জিরো-শাটার ল্যাগ সক্ষম করতে, ImageCapture.Builder.setCaptureMode()CAPTURE_MODE_ZERO_SHOT_LAG পাস করুন। যদি অসফল হয়, setCaptureMode() CAPTURE_MODE_MINIMIZE_LATENCY এ ফিরে আসে।

সেট ফ্ল্যাশমোড()

ডিফল্ট ফ্ল্যাশ মোড হল 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 বিন্যাস সমর্থন করে. YUV_420_888 ফরম্যাট থেকে একটি Media.Image অবজেক্টকে RGB Bitmap অবজেক্টে কীভাবে রূপান্তর করা যায় তা দেখায় এমন নমুনা কোডের জন্য, YuvToRgbConverter.kt দেখুন।

অতিরিক্ত সম্পদ

CameraX সম্পর্কে আরও জানতে, নিম্নলিখিত অতিরিক্ত সংস্থানগুলি দেখুন৷

কোডল্যাব

  • CameraX দিয়ে শুরু করা
  • কোড নমুনা

  • CameraX নমুনা অ্যাপ