Görüntü yakalama

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:

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ğlanan OnImageCapturedCallback() 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:

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:

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:

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

  • CameraX'i kullanmaya başlama
  • Kod örneği

  • CameraX örnek uygulamaları