इमेज कैप्चर करना

इमेज कैप्चर इस्तेमाल के उदाहरण को हाई-रिज़ॉल्यूशन कैप्चर करने के लिए डिज़ाइन किया गया है, यह सुविधा, फ़ोटो को अपने-आप सफ़ेद होने और एक्सपोज़र सही करने के लिए, इसमें ऑटो-फ़ोकस (3A) की सुविधा मिलती है. साथ ही, इसमें मैन्युअल तरीके से कैमरा कंट्रोल करने की सुविधा भी मिलती है. यह फ़ैसला लेने की ज़िम्मेदारी कॉलर की है कि कैप्चर की गई तस्वीर को कैसे इस्तेमाल करना है, इसमें ये विकल्प शामिल हैं:

पसंद के मुताबिक बनाए जा सकने वाले दो तरह के एक्ज़िक्यूटर हैं, जिन पर ImageCapture चलता है, कॉलबैक एक्ज़िक्यूटर और IO एक्ज़ेक्यूटर को असाइन किया जाता है.

  • कॉलबैक एक्ज़ीक्यूटर, takePicture तरीकों का पैरामीटर है. हां इसका इस्तेमाल, उपयोगकर्ता के दिए गए OnImageCapturedCallback() को लागू करने के लिए किया जाता है.
  • अगर कॉलर, इमेज को किसी फ़ाइल की जगह पर सेव करना चुनता है, तो IO करने वाला मैनेजर. IO एक्ज़िक्यूटर सेट करने के लिए, कॉल करें 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() का इस्तेमाल करके पता लगाएं कि आपका डिवाइस इन ज़रूरी शर्तों को पूरा करता है या नहीं:

ज़रूरी शर्तें पूरी न करने वाले डिवाइसों के लिए, CameraX CAPTURE_MODE_MINIMIZE_LATENCY हो जाता है.

ज़ीरो-शटर लैग सिर्फ़ इमेज कैप्चर के इस्तेमाल के उदाहरण के लिए उपलब्ध है. आप इसे वीडियो कैप्चर के लिए चालू नहीं कर सकते इस्तेमाल का उदाहरण या कैमरा एक्सटेंशन के साथ. आख़िर में, Flash इस्तेमाल करने से इंतज़ार का समय बढ़ जाता है, फ़्लैश के चालू या ऑटो मोड में होने पर ज़ीरो-शटर लैग काम नहीं करता. फ़्लैश मोड सेट करने के बारे में ज़्यादा जानकारी के लिए, setFlashMode() देखें.

ज़ीरो-शटर लैग चालू करें

ज़ीरो-शटर लैग को चालू करने के लिए, CAPTURE_MODE_ZERO_SHOT_LAG को ImageCapture.Builder.setCaptureMode() पर पास करें. अगर विफल होता है, तो setCaptureMode() वापस CAPTURE_MODE_MINIMIZE_LATENCY पर चला जाता है.

सेटफ़्लैशमोड()

डिफ़ॉल्ट फ़्लैश मोड 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 के बारे में ज़्यादा जानने के लिए, यहां दिए गए अन्य संसाधन देखें.

कोडलैब (कोड बनाना सीखना)

  • CameraX का इस्तेमाल शुरू करना
  • कोड सैंपल

  • CameraX के सैंपल ऐप्लिकेशन