Görüntü yakalama kullanım alanı, yüksek çözünürlüklü, yüksek kaliteli fotoğraflar çeker ve otomatik beyaz dengesi, otomatik pozlama ve Otomatik odaklama (3A) işlevine ek olarak basit manuel kamera kontrollerine ek olarak. Arayan kişi, çekilen fotoğrafın nasıl kullanılacağına karar vermekten sorumludur. şunları içerir:
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
, üzerinde çalıştığı iki tür özelleştirilebilir yürütücü vardır.
ve IO yürütücüsünü kullanır.
- Geri çağırma yürütücü,
takePicture
yöntemlerinin parametresidir. Evet kullanıcı tarafından sağlananOnImageCapturedCallback()
öğesini yürütmek için kullanılır. - Arayan kişi, resmi bir dosya konumuna kaydetmeyi seçerse
bir yürütücüye sokacağım. IO yürütücüyü ayarlamak için şunu arayın:
ImageCapture.Builder.setIoExecutor(Executor)
. Yürütücü yoksa CameraX varsayılan olarak görebilmeli.
Görüntü çekmeyi kur
Görüntü yakalama özelliği, resim çekmek için temel kontroller sağlar. flaş, sürekli otomatik odaklama, sıfır-shutter gecikmesi ve daha fazlası.
setCaptureMode()
ImageCapture.Builder.setCaptureMode()
kullanın
fotoğraf çekerken çekim modunu yapılandırmak için:
CAPTURE_MODE_MINIMIZE_LATENCY
: Görüntü yakalamayı gecikme için optimize eder.CAPTURE_MODE_MAXIMIZE_QUALITY
: Resim yakalamayı resim kalitesi için optimize eder.
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, Sıfır Deklanşör Gecikmesi (CAPTURE_MODE_ZERO_SHOT_LAG
) çekim modu olarak kullanılabilir.
Sıfır Deklanşör Gecikmesi etkinken gecikme, varsayılan çekim moduna (CAPTURE_MODE_MINIMIZE_LATENCY
) kıyasla önemli ölçüde azalır. Böylece hiçbir zaman çekimi kaçırmazsınız.
Sıfır Deklanşör Gecikmesi, en son üç çekim karesini depolayan bir halka arabellek kullanır. Kullanıcı yakalama düğmesine bastığında CameraX, takePicture()
öğesini çağırır ve zil arabelleği, yakalanan kareyi düğmeye basıldığında en yakın zaman damgasıyla alır. Daha sonra CameraX, yakalama oturumunu yeniden işleyerek bu kareden bir görüntü oluşturur ve bu resim, diske JPEG biçiminde kaydedilir.
Ön koşullar
Sıfır Deklanşör Gecikmesi'ni etkinleştirmeden önce cihazınızın aşağıdaki gereksinimleri karşılayıp karşılamadığını belirlemek için isZslSupported()
aracını kullanın:
- Android 6.0 ve sonraki sürümleri (API düzeyi 23 ve sonraki sürümler) hedefler.
PRIVATE
yeniden işlenmesini destekler.
Minimum gereksinimleri karşılamayan cihazlarda CameraX, 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 kullanılabilir.
Bu özelliği Video yakalama için etkinleştiremezsiniz
kullanın veya Kamera uzantıları kullanın.
Son olarak, flash kullanılması daha fazla gecikmeye yol açtığından,
Sıfır Deklanşör Gecikmesi, flaş AÇIK veya OTOMATİK modundayken ç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 CAPTURE_MODE_ZERO_SHOT_LAG
değerini ImageCapture.Builder.setCaptureMode()
cihazına geçirin. Başarısız olursa setCaptureMode()
, CAPTURE_MODE_MINIMIZE_LATENCY
değerine geri döner.
setFlashMode()
Varsayılan flaş modu FLASH_MODE_OFF
şeklindedir. Flaş modunu ayarlamak için ImageCapture.Builder.setFlashMode()
düğmesini kullanın:
FLASH_MODE_ON
: Flaş her zaman açıktır.FLASH_MODE_AUTO
: Düşük ışıkta çekimlerde 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 Camera
nesnesi döndürdüğünü unutmayın. Yakınlaştırma ve pozlama gibi kamera çıkışını kontrol etme hakkında daha fazla bilgi için bu kılavuza bakın.
Kamerayı yapılandırdıktan sonra aşağıdaki kod kullanıcı işlemi:
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çimindedir. Örnek kod için
Media.Image
dönüştürüldüğünü gösteren
YUV_420_888
biçiminden RGB nesne
Bitmap
nesnesi için bkz.
YuvToRgbConverter.kt
Ek kaynaklar
CameraX hakkında daha fazla bilgi edinmek için aşağıdaki ek kaynaklara bakın.
Kod Laboratuvarı
Kod örneği