Görüntü yakalama kullanım alanı, yüksek çözünürlüklü ve yüksek kaliteli fotoğraflar çekmek için tasarlanmıştır. Bu kullanım alanı, basit manuel kamera kontrollerinin yanı sıra otomatik beyaz denge, otomatik pozlama ve otomatik odaklama (3A) işlevleri sağlar. Arayan, aşağıdaki seçenekler de dahil olmak üzere, çekilen resmin nasıl kullanılacağına karar vermekten sorumludur:
takePicture(Executor, OnImageCapturedCallback)
: Bu yöntem, yakalanan görüntünün bellek içi arabelleğini sağlar.takePicture(OutputFileOptions, Executor, OnImageSavedCallback)
: Bu yöntem, yakalanan görüntüyü sağlanan dosya konumuna kaydeder.
ImageCapture
ürününün çalıştığı iki tür özelleştirilebilir yürütücü vardır: geri çağırma yürütücü ve IO yürütücü.
- Geri çağırma yürütücüsü,
takePicture
yöntemlerinin parametresidir. Kullanıcı tarafından sağlananOnImageCapturedCallback()
dosyasını yürütmek için kullanılır. - Arayan, görüntüyü bir dosya konumuna kaydetmeyi seçerse IO'yu yapacak bir yürütücü belirtebilirsiniz. IO yürütücüsünü ayarlamak için
ImageCapture.Builder.setIoExecutor(Executor)
çağrısı yapın. Yürütücü yoksa CameraX, görev için varsayılan olarak dahili bir IO yürütücüye ayarlanır.
Resim çekmeyi ayarlayın
Resim yakalama, resim çekerken flaş, sürekli otomatik odaklama, sıfır çekim gecikmesi ve daha fazlası gibi temel kontroller sağlar.
setCaptureMode()
Fotoğraf çekerken çekim modunu yapılandırmak için ImageCapture.Builder.setCaptureMode()
aracını kullanın:
CAPTURE_MODE_MINIMIZE_LATENCY
: Resim yakalamayı gecikme için optimize edin.CAPTURE_MODE_MAXIMIZE_QUALITY
: Resim yakalamayı resim kalitesi için optimize edin.
Yakalama modu varsayılan olarak CAPTURE_MODE_MINIMIZE_LATENCY
değerine ayarlanır.
Daha fazla bilgi için setCaptureMode()
referans belgelerini inceleyin.
Sıfır Deklanşör Gecikmesi
1.2 sürümünden itibaren, çekim modu olarak Sıfır Deklanşör Gecikme (CAPTURE_MODE_ZERO_SHOT_LAG
) kullanılabilir.
Sıfır Deklanşör Gecikmesi etkinken gecikme, varsayılan çekim modu olan CAPTURE_MODE_MINIMIZE_LATENCY
'e kıyasla önemli ölçüde azalır, böylece kareyi hiçbir zaman kaçırmazsınız.
Sıfır Deklanşör Gecikmesi, en son üç çekim karesini depolayan bir halka arabelleği kullanır. Bir kullanıcı kayıt düğmesine bastığında CameraX takePicture()
yöntemini çağırır ve halka arabelleği yakalanan kareyi, düğmeye basılana en yakın zaman damgasıyla getirir. Daha sonra CameraX, diske JPEG biçiminde kaydedilen bir kareden görüntü oluşturmak için yakalama oturumunu yeniden işler.
Ön koşullar
Sıfır Deklanşör Gecikmesi'ni etkinleştirmeden önce isZslSupported()
kullanarak cihazınızın aşağıdaki gereksinimleri karşılayıp karşılamadığını belirleyin:
- Android 6.0 ve sonraki sürümleri (API düzeyi 23 ve sonraki sürümler) hedefler.
PRIVATE
'in yeniden işlemesini destekler.
KameraX, minimum gereksinimleri karşılamayan cihazlarda CAPTURE_MODE_MINIMIZE_LATENCY
sürümüne geri döner.
Sıfır Deklanşör Gecikmesi, yalnızca Resim yakalama kullanım alanında mevcuttur.
Bu özelliği Video yakalama kullanım alanı için veya Kamera uzantıları ile etkinleştiremezsiniz.
Son olarak, flaş kullanımı daha fazla gecikmeye yol açtığından, flaş AÇIK veya OTOMATİK modundayken Sıfır Deklanşör Gecikmesi çalışmaz.
Flaş modunu ayarlama hakkında daha fazla bilgi için setFlashMode()
bölümüne bakın.
Sıfır Deklanşör Gecikmesini Etkinleştir
Sıfır Deklanşör Gecikmesini etkinleştirmek için ImageCapture.Builder.setCaptureMode()
cihazına CAPTURE_MODE_ZERO_SHOT_LAG
geçin. Başarısız olursa setCaptureMode()
, CAPTURE_MODE_MINIMIZE_LATENCY
değerine geri döner.
setFlashMode()
Varsayılan flaş modu FLASH_MODE_OFF
'tir. Flaş modunu ayarlamak için ImageCapture.Builder.setFlashMode()
simgesini kullanın:
FLASH_MODE_ON
: Flash her zaman açıktır.FLASH_MODE_AUTO
: Düşük ışıkta çekim yapıldığında flaş otomatik olarak açılır.
Fotoğraf çek
Aşağıdaki kod örneğinde, uygulamanızı fotoğraf çekmek için nasıl yapılandıracağınız gösterilmektedir:
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()
işlevinin bir Camera
nesnesi döndürdüğünü unutmayın. Yakınlaştırma ve pozlama gibi kamera çıkışını kontrol etmeyle ilgili daha fazla bilgi için bu kılavuza bakın.
Kamerayı yapılandırdıktan sonra, aşağıdaki kod kullanıcı işlemine bağlı olarak fotoğraf çeker:
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. } } ); }
Görüntü yakalama yöntemi, JPEG
biçimini tam olarak destekler. Bir Media.Image
nesnesinin YUV_420_888
biçiminden RGB Bitmap
nesnesine nasıl dönüştürüleceğini gösteren örnek kod için YuvToRgbConverter.kt
bölümüne bakın.
Ek kaynaklar
CameraX hakkında daha fazla bilgi edinmek için aşağıdaki ek kaynaklara bakın.
Codelab
Kod örneği