इमेज कैप्चर इस्तेमाल के उदाहरण को हाई-रिज़ॉल्यूशन कैप्चर करने के लिए डिज़ाइन किया गया है, यह सुविधा, फ़ोटो को अपने-आप सफ़ेद होने और एक्सपोज़र सही करने के लिए, इसमें ऑटो-फ़ोकस (3A) की सुविधा मिलती है. साथ ही, इसमें मैन्युअल तरीके से कैमरा कंट्रोल करने की सुविधा भी मिलती है. यह फ़ैसला लेने की ज़िम्मेदारी कॉलर की है कि कैप्चर की गई तस्वीर को कैसे इस्तेमाल करना है, इसमें ये विकल्प शामिल हैं:
takePicture(Executor, OnImageCapturedCallback)
: यह तरीका कैप्चर की गई इमेज का इन-मेमोरी बफ़र उपलब्ध कराता है.takePicture(OutputFileOptions, Executor, OnImageSavedCallback)
: इस तरीके का इस्तेमाल करके, कैप्चर की गई इमेज को दी गई फ़ाइल की जगह पर सेव किया जाता है.
पसंद के मुताबिक बनाए जा सकने वाले दो तरह के एक्ज़िक्यूटर हैं, जिन पर 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()
का इस्तेमाल करके पता लगाएं कि आपका डिवाइस इन ज़रूरी शर्तों को पूरा करता है या नहीं:
- Android 6.0+ (एपीआई लेवल 23 और उसके बाद के वर्शन) को टारगेट करता है.
PRIVATE
को फिर से प्रोसेस करने की सुविधा काम करती है.
ज़रूरी शर्तें पूरी न करने वाले डिवाइसों के लिए, 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 के बारे में ज़्यादा जानने के लिए, यहां दिए गए अन्य संसाधन देखें.
कोडलैब (कोड बनाना सीखना)
कोड सैंपल