Her CameraX kullanım alanını, kullanımın farklı yönlerini kontrol edecek şekilde yapılandırırsınız üzerine konuşacağız.
Örneğin, görüntü yakalama için hedef en boy oranı ayarlayabilirsiniz. bir de flaş modu var. Aşağıdaki kodda bir örnek gösterilmektedir:
Kotlin
val imageCapture = ImageCapture.Builder() .setFlashMode(...) .setTargetAspectRatio(...) .build()
Java
ImageCapture imageCapture = new ImageCapture.Builder() .setFlashMode(...) .setTargetAspectRatio(...) .build();
Bazı kullanım alanlarında, yapılandırma seçeneklerine ek olarak API'ler dinamik olarak Kullanım alanı oluşturulduktan sonra ayarları değiştirmeye çalışıyor. Daha fazla bilgi için özel kullanım alanlarına özel yapılandırma ile ilgili daha fazla bilgi edinmek için önizleme, Analiz etme images ve Resim yakalama.
CameraXConfig
Basitlik sağlamak için CameraX, çoğu kullanım senaryosuna uygun dahili yürütücüler ve işleyiciler gibi varsayılan yapılandırmalara sahiptir. Ancak,
uygulamanın özel gereksinimleri varsa veya bunları özelleştirmeyi tercih ediyorsa
yapılandırmalar, CameraXConfig
arayüz bu amaca yönelik.
CameraXConfig
ile bir uygulama şunları yapabilir:
- Başlatma gecikmesini optimize etmek için:
setAvailableCameraLimiter()
. - Uygulamanın yürütücüsünü CameraX'e sağlayın:
setCameraExecutor()
. - Varsayılan planlayıcı işleyicisini
setSchedulerHandler()
ile değiştirin. - Günlük kaydı düzeyini
setMinimumLoggingLevel()
ile değiştirin.
Kullanım Modeli
Aşağıdaki prosedürde, CameraXConfig
değerinin nasıl kullanılacağı açıklanmaktadır:
- Özelleştirilmiş yapılandırmalarınızla bir
CameraXConfig
nesnesi oluşturun. Application
öğenizeCameraXConfig.Provider
arayüzünü uygulayın veCameraXConfig
nesnenizigetCameraXConfig()
içinde döndürün.Application
sınıfınızıAndroidManifest.xml
dosyanıza şu şekilde ekleyin: burada açıklanmıştır.
Örneğin, aşağıdaki kod örneğinde CameraX günlük kaydı hata ile yalnızca mesajlar:
Kotlin
class CameraApplication : Application(), CameraXConfig.Provider { override fun getCameraXConfig(): CameraXConfig { return CameraXConfig.Builder.fromConfig(Camera2Config.defaultConfig()) .setMinimumLoggingLevel(Log.ERROR).build() } }
Uygulamanızın, ayarladıktan sonra CameraX yapılandırmasını bilmesi gerekiyorsa CameraXConfig
nesnesinin yerel bir kopyasını saklayın.
Kamera sınırlayıcı
İlk çağrı sırasında
ProcessCameraProvider.getInstance()
,
CameraX,
olanak tanır. CameraX'in donanım bileşenleriyle iletişim kurması gerektiğinden bu işlem, özellikle de düşük kaliteli cihazlarda her kamera için önemli miktarda zaman alabilir. Uygulamanız yalnızca cihazdaki belirli kameraları (ör. varsayılan ön kamera) kullanıyorsa CameraX'i diğer kameraları yoksayacak şekilde ayarlayabilirsiniz. Bu, uygulamanızın kullandığı kameraların başlatma gecikmesini azaltabilir.
CameraXConfig.Builder.setAvailableCamerasLimiter()
metoduna iletilen CameraSelector
bir kamerayı filtrelerse CameraX, söz konusu kamera yokmuş gibi davranır. Örneğin, aşağıdaki kod uygulamayı yalnızca cihazın varsayılan arka kamerasını kullanacak şekilde sınırlandırır:
Kotlin
class MainApplication : Application(), CameraXConfig.Provider { override fun getCameraXConfig(): CameraXConfig { return CameraXConfig.Builder.fromConfig(Camera2Config.defaultConfig()) .setAvailableCamerasLimiter(CameraSelector.DEFAULT_BACK_CAMERA) .build() } }
Mesaj dizileri
CameraX'in oluşturulduğu platform API'lerinin çoğu, engelleme gerektirir
donanımla süreçler arası iletişim (IPC)
kalan süreyi ifade eder. Bu nedenle CameraX, ana iş parçacığının engellenmemesini ve kullanıcı arayüzünün akıcı kalmasını sağlamak için bu API'leri yalnızca arka plan iş parçacıklarından çağırır. CameraX, bu davranışın şeffaf görünmesi için bu arka plan iş parçacıklarını dahili olarak yönetir. Ancak bazı uygulamalarda mesaj dizilerinin sıkı bir şekilde kontrol edilmesi gerekir. CameraXConfig
, bir uygulamanın CameraXConfig.Builder.setCameraExecutor()
ve CameraXConfig.Builder.setSchedulerHandler()
aracılığıyla kullanılan arka plan iş parçacıklarını ayarlamasına olanak tanır.
Kamera Yürütücü
Kamera yürütücü, tüm dahili kamera platformu API çağrıları ve bu API'lerden gelen geri çağırma çağrıları için kullanılır. CameraX, dahili bir
Bu görevleri gerçekleştirmek için Executor
.
Ancak uygulamanız için daha sıkı bir iş parçacığı kontrolü gerekiyorsa CameraXConfig.Builder.setCameraExecutor()
değerini kullanın.
Planlayıcı işleyici
Planlayıcı işleyici, dahili görevleri sabit aralıklarla planlamak için kullanılır (ör. kamera kullanılamadığında kamerayı tekrar açmayı denemek). Bu işleyici şunları yapar:
görevleri yürütmez ve yalnızca kamera yürütücüye gönderir. Bazen geri çağırma için Handler
gerektiren eski API platformlarında da kullanılır. Bu gibi durumlarda geri çağırma işlevleri yine yalnızca doğrudan kamera yürütücüsüne gönderilir. KameraX
dahili bir raporu tahsis eder
Bu görevleri gerçekleştirmek için HandlerThread
,
ancak CameraXConfig.Builder.setSchedulerHandler()
ile geçersiz kılabilirsiniz.
Günlük kaydı
CameraX günlüğü, uygulamaların logcat mesajlarını filtrelemesine olanak tanır. ve üretim kodunuzda ayrıntılı mesajlardan kaçının. CameraX, en ayrıntılıdan en ciddiye kadar dört günlük kaydı düzeyini destekler:
Log.DEBUG
(varsayılan)Log.INFO
Log.WARN
Log.ERROR
Bu günlük düzeylerinin ayrıntılı açıklamaları için Android Günlüğü dokümanlarına bakın. Uygulamanız için uygun günlük kaydı düzeyini ayarlamak üzere CameraXConfig.Builder.setMinimumLoggingLevel(int)
öğesini kullanın.
Otomatik seçim
CameraX, otomatik olarak cihaza özgü işlevleri çalışır. Örneğin, CameraX, makine öğreniminin bir çözünürlük belirtmediğinizde veya çözünürlük desteklenmediğini doğrulayın. Tüm bu işlemler kitaplık tarafından gerçekleştirilir. Böylece cihaza özel kod yazmak zorunda kalmazsınız.
CameraX'in amacı, kamera oturumunu başarıyla başlatmaktır. Bu, CameraX'in cihazın kapasitesine göre çözünürlük ve en boy oranlarında ödün vereceği anlamına gelir. Güvenlik ihlali aşağıdaki nedenlerden dolayı gerçekleşebilir:
- Cihaz, istenen çözünürlüğü desteklemiyor.
- Cihazda, düzgün şekilde çalışmasını sağlamalısınız.
- Bazı cihazlarda belirli biçimler yalnızca belirli en boy oranlarında kullanılabilir.
- Cihazda "en yakın mod16" tercihi var JPEG veya video için
kullanır. Daha fazla bilgi için
SCALER_STREAM_CONFIGURATION_MAP
konusuna bakın.
CameraX, oturumu oluşturup yönetse de her zaman resim boyutlarını kodunuzda döndürdüğünüzden emin olun ve buna göre ayarlamalar yapın.
Döndürme
Kamera rotasyonu, kullanım alanı oluşturulurken varsayılan ekranın rotasyonuyla eşleşecek şekilde varsayılan olarak ayarlanır. Bu varsayılan durumda CameraX, uygulamanın önizlemede görmeyi beklediğinizle eşleşmesini sağlamak için çıkışlar oluşturur. Kullanım alanı nesnelerini yapılandırırken mevcut ekran yönünü ileterek veya oluşturulduktan sonra dinamik olarak çoklu ekranlı cihazları desteklemek için rotasyonu özel bir değerle değiştirebilirsiniz.
Uygulamanız, yapılandırma ayarlarını kullanarak hedef rotasyonu ayarlayabilir. Bu durumda
kullanım alanı API'lerindeki yöntemleri (ör.
ImageAnalysis.setTargetRotation()
),
çalışması mümkün olacaktır. Bu yöntemi, uygulama dikey moda kilitlendiğinde (ve dolayısıyla döndürüldüğünde yeniden yapılandırma yapılmadığında) kullanabilirsiniz. Ancak fotoğraf veya analiz kullanım alanının, cihazın mevcut dönüşünü bilmesi gerekir. Örneğin, yüz algılama için yüzlerin doğru yönde olması veya fotoğrafların yatay ya da dikey olarak ayarlanması amacıyla döndürme bilgisine ihtiyaç duyulabilir.
Çekilen görüntülere ait veriler, döndürme bilgileri olmadan saklanabilir. Exif verileri, galeri uygulamalarının resmi kaydettikten sonra doğru yönde gösterebilmesi için döndürme bilgilerini içerir.
Önizleme verilerini doğru yönde görüntülemek için meta verileri kullanabilirsiniz
çıkış kaynağı
Preview.PreviewOutput()
oluşturmak için de kullanılabilir.
Aşağıdaki kod örneğinde, bir yön etkinliğinde döndürmenin nasıl ayarlanacağı gösterilmektedir:
Kotlin
override fun onCreate() { val imageCapture = ImageCapture.Builder().build() val orientationEventListener = object : OrientationEventListener(this as Context) { override fun onOrientationChanged(orientation : Int) { // Monitors orientation values to determine the target rotation value val rotation : Int = when (orientation) { in 45..134 -> Surface.ROTATION_270 in 135..224 -> Surface.ROTATION_180 in 225..314 -> Surface.ROTATION_90 else -> Surface.ROTATION_0 } imageCapture.targetRotation = rotation } } orientationEventListener.enable() }
Java
@Override public void onCreate() { ImageCapture imageCapture = new ImageCapture.Builder().build(); OrientationEventListener orientationEventListener = new OrientationEventListener((Context)this) { @Override public void onOrientationChanged(int orientation) { int rotation; // Monitors orientation values to determine the target rotation value if (orientation >= 45 && orientation < 135) { rotation = Surface.ROTATION_270; } else if (orientation >= 135 && orientation < 225) { rotation = Surface.ROTATION_180; } else if (orientation >= 225 && orientation < 315) { rotation = Surface.ROTATION_90; } else { rotation = Surface.ROTATION_0; } imageCapture.setTargetRotation(rotation); } }; orientationEventListener.enable(); }
Ayarlanan rotasyona bağlı olarak her kullanım alanı resim verilerini döndürür doğrudan veya döndürülmemiş resmin tüketicilerine rotasyon meta verisi sağlar dışı verilerdir.
- Önizleme: Meta veri çıkışı,
Preview.getTargetRotation()
kullanılarak hedef çözünürlüğün döndürülmesinin bilinmesi için sağlanır. - ImageAnalysis: Meta veri çıkışı, resim arabelleği koordinatlarının görüntü koordinatlarına göre bilinmesi için sağlanır.
- ImageCapture: Resim Exif meta verileri, arabellek veya hem arabellek hem de meta veriler, döndürme ayarını belirtecek şekilde değiştirilir. Değiştirilen değer HAL uygulamasına bağlıdır.
Kırpma dikdörtgeni
Varsayılan olarak kırpma dikdörtgeni tam arabellek alanıdır. ViewPort
ve UseCaseGroup
ile özelleştirebilirsiniz. CameraX, kullanım alanlarını gruplandırıp görüntü alanını ayarlayarak gruptaki tüm kullanım alanlarının kırpma dikdörtgenlerinin kamera sensöründeki aynı alanı işaretlemesini sağlar.
Aşağıdaki kod snippet'inde bu iki sınıfın nasıl kullanılacağı gösterilmektedir:
Kotlin
val viewPort = ViewPort.Builder(Rational(width, height), display.rotation).build() val useCaseGroup = UseCaseGroup.Builder() .addUseCase(preview) .addUseCase(imageAnalysis) .addUseCase(imageCapture) .setViewPort(viewPort) .build() cameraProvider.bindToLifecycle(lifecycleOwner, cameraSelector, useCaseGroup)
Java
ViewPort viewPort = new ViewPort.Builder( new Rational(width, height), getDisplay().getRotation()).build(); UseCaseGroup useCaseGroup = new UseCaseGroup.Builder() .addUseCase(preview) .addUseCase(imageAnalysis) .addUseCase(imageCapture) .setViewPort(viewPort) .build(); cameraProvider.bindToLifecycle(lifecycleOwner, cameraSelector, useCaseGroup);
ViewPort
, son kullanıcıların görebileceği arabellek dikdörtgenini tanımlar. KameraX ise
özelliklerine göre mümkün olan en büyük kırpma alanını
kullanım alanı ekleyin. WYSIWYG etkisi elde etmek için genellikle
önizleme kullanım alanına göre değiştirebilirsiniz. Görüntü alanını almanın basit bir yolu
PreviewView
kullanmak için.
Aşağıdaki kod snippet'lerinde, ViewPort
nesnesinin nasıl alınacağı gösterilmektedir:
Kotlin
val viewport = findViewById<PreviewView>(R.id.preview_view).viewPort
Java
ViewPort viewPort = ((PreviewView)findViewById(R.id.preview_view)).getViewPort();
Önceki örnekte, uygulamanın ImageAnalysis
ve ImageCapture
'ten aldığı değerler, PreviewView
'nin ölçek türünün varsayılan FILL_CENTER
olarak ayarlandığı varsayılarak son kullanıcının PreviewView
'de gördüğü değerlerle eşleşir. Kırpma dikdörtgeni ve döndürme işlemi çıkış arabelleğine uygulandıktan sonra, tüm kullanım alanlarındaki resim aynıdır ancak farklı çözünürlüklere sahip olabilir. Dönüşüm bilgilerinin nasıl uygulanacağı hakkında daha fazla bilgi için çıktıyı dönüştürme bölümüne bakın.
Kamera seçimi
KameraX otomatik olarak uygulamanızın en iyi kamera cihazını seçer kullanım alanlarını ifade eder. Sizin için seçilen cihazdan farklı bir cihaz kullanmak istiyorsanız birkaç seçeneğiniz vardır:
- Şunlarla varsayılan ön kamerayı iste:
CameraSelector.DEFAULT_FRONT_CAMERA
. CameraSelector.DEFAULT_BACK_CAMERA
simgesini kullanarak varsayılan arka kamerayı isteyin.- Kullanılabilir cihazların listesini şu ölçütlere göre filtreleyin:
CameraCharacteristics
şununla:CameraSelector.Builder.addCameraFilter()
.
Aşağıdaki kod örneğinde, cihaz seçimini etkilemek için CameraSelector
öğesinin nasıl oluşturulacağı gösterilmektedir:
Kotlin
fun selectExternalOrBestCamera(provider: ProcessCameraProvider):CameraSelector? { val cam2Infos = provider.availableCameraInfos.map { Camera2CameraInfo.from(it) }.sortedByDescending { // HARDWARE_LEVEL is Int type, with the order of: // LEGACY < LIMITED < FULL < LEVEL_3 < EXTERNAL it.getCameraCharacteristic(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL) } return when { cam2Infos.isNotEmpty() -> { CameraSelector.Builder() .addCameraFilter { it.filter { camInfo -> // cam2Infos[0] is either EXTERNAL or best built-in camera val thisCamId = Camera2CameraInfo.from(camInfo).cameraId thisCamId == cam2Infos[0].cameraId } }.build() } else -> null } } // create a CameraSelector for the USB camera (or highest level internal camera) val selector = selectExternalOrBestCamera(processCameraProvider) processCameraProvider.bindToLifecycle(this, selector, preview, analysis)
Aynı anda birden fazla kamera seçme
CameraX 1.3'ten itibaren aynı anda birden fazla kamera da seçebilirsiniz. Örneğin, ön ve arka kamerayı bağlayarak aynı anda her iki açıdan da fotoğraf çekebilir veya video kaydedebilirsiniz.
Eşzamanlı Kamera özelliği kullanıldığında cihaz, farklı yönlere bakan lenslere sahip iki kamerayı veya iki arka kamerayı aynı anda çalıştırabilir. Aşağıdaki kod bloğunda, aşağıdaki durumlarda iki kameranın nasıl
bindToLifecycle
çağrılıyor ve döndürülen nesneden her iki Kamera nesnesinin nasıl alınacağı
ConcurrentCamera
nesne algılandı.
Kotlin
// Build ConcurrentCameraConfig val primary = ConcurrentCamera.SingleCameraConfig( primaryCameraSelector, useCaseGroup, lifecycleOwner ) val secondary = ConcurrentCamera.SingleCameraConfig( secondaryCameraSelector, useCaseGroup, lifecycleOwner ) val concurrentCamera = cameraProvider.bindToLifecycle( listOf(primary, secondary) ) val primaryCamera = concurrentCamera.cameras[0] val secondaryCamera = concurrentCamera.cameras[1]
Java
// Build ConcurrentCameraConfig SingleCameraConfig primary = new SingleCameraConfig( primaryCameraSelector, useCaseGroup, lifecycleOwner ); SingleCameraConfig secondary = new SingleCameraConfig( primaryCameraSelector, useCaseGroup, lifecycleOwner ); ConcurrentCamera concurrentCamera = mCameraProvider.bindToLifecycle(Arrays.asList(primary, secondary)); Camera primaryCamera = concurrentCamera.getCameras().get(0); Camera secondaryCamera = concurrentCamera.getCameras().get(1);
Kamera çözünürlüğü
KameraX'in resim çözünürlüğünü bir kombinasyona göre ayarlamasına izin verebilirsiniz özellikleri, cihazın desteklenen donanımı seviyesi ise en boy oranı sağlanıyor. Alternatif olarak, bu yapılandırmayı destekleyen kullanım alanlarında belirli bir hedef çözünürlük veya belirli bir en boy oranı ayarlayabilirsiniz.
Otomatik çözünürlük
CameraX, içerdiği görüntülere dayalı olarak en iyi çözünürlük ayarlarını otomatik olarak
kullanım alanları için cameraProcessProvider.bindToLifecycle()
. Mümkün olduğunda, tek bir oturumda eşzamanlı olarak çalıştırılması gereken tüm kullanım alanlarını tek bir bindToLifecycle()
çağrısında belirtin. CameraX, çözünürlükleri cihazın desteklenen donanım düzeyini ve cihaza özgü varyasyonu (cihazın mevcut yayın yapılandırmalarını aştığı veya karşılamadığı durumlar) dikkate alarak bağlı kullanım alanı grubuna göre belirler.
Amaç, uygulamanın aynı zamanda çok çeşitli cihazlarda çalışmasını
cihaza özel kod yollarını en aza indirin.
Görüntü yakalama ve görüntü analizi kullanım alanları için varsayılan en boy oranı 4:3'tür.
Kullanım alanları, uygulamanın belirtmesi için yapılandırılabilir bir en boy oranına sahiptir. kullanıcı arayüzü tasarımına göre istenen en boy oranı. CameraX çıkışı şunun için üretilir: istenen en boy oranları cihazın desteklediği en boy oranıyla eşleşmelidir. Varsa tam eşleşme çözünürlüğü desteklenmez (en fazla koşulu karşılayan çözünürlük) seçili olduğundan emin olun. Böylelikle uygulama, kameranın görüntü alanında nasıl görüneceğini ve CameraX, bu çözünürlüğü karşılayacak en iyi kamera çözünürlüğü ayarlarını belirler farklı cihazlarda kullanabilirsiniz.
Örneğin, bir uygulama aşağıdakilerden herhangi birini yapabilir:
- Kullanım alanı için 4:3 veya 16:9 hedef çözünürlüğü belirtin
- CameraX'in en yakın çözünürlüğü bulmaya çalıştığı özel bir çözünürlük belirtin şununla eşleştir:
ImageCapture
için kırpma en boy oranı belirtin
CameraX, dahili Camera2 yüzey çözünürlüğünü otomatik olarak seçer. İlgili içeriği oluşturmak için kullanılan aşağıdaki tabloda çözünürlükler gösterilmektedir:
Kullanım alanı | Dahili yüzey çözünürlüğü | Çıkış verilerinin çözünürlüğü |
---|---|---|
Önizle | En Boy Oranı: Hedefe en uygun çözünürlük, ayarını değiştirebilirsiniz. | Dahili yüzey çözünürlüğü. Bir Görünümün kırpılmasına izin vermek için meta veriler hedef en boy oranına göre ölçeklenir ve döndürülür. |
Varsayılan çözünürlük: En yüksek önizleme çözünürlüğü veya önizlemenin en boy oranına uyan, cihaz tarafından tercih edilen en yüksek çözünürlük. | ||
Maksimum çözünürlük: En iyi boyutu ifade eden önizleme boyutu cihazın ekran çözünürlüğüyle veya 1080p (1920x1080) çözünürlüğe sahip olmalıdır. | ||
Görüntü analizi | En boy oranı: Hedefe en uygun çözünürlük, ayarını değiştirebilirsiniz. | Dahili yüzey çözünürlüğü. |
Varsayılan çözünürlük: Varsayılan hedef çözünürlük ayarı: 640x480. Hem hedef çözünürlüğü hem de karşılık gelen en boy oranını ayarlama en iyi desteklenen çözümle sonuçlanacaktır. | ||
Maksimum çözünürlük: Kamera cihazının maksimum çıkış çözünürlüğü.
Şuradan alınan YUV_420_888 biçimi
StreamConfigurationMap.getOutputSizes() .
Hedef çözünürlük varsayılan olarak 640x480 olarak ayarlanır. Bu nedenle, 640x480'den daha büyük bir çözünürlük istiyorsanız
setTargetResolution()
ve
setTargetAspectRatio()
ve desteklenen çözünürlüklerden en yakın olanı bulun.
|
||
Resim yakalama | En boy oranı: Ayara en uygun en boy oranı. | Dahili yüzey çözünürlüğü. |
Varsayılan çözünürlük: Mevcut en yüksek çözünürlük veya ImageCapture'ın en boy oranına uyan, cihaz tarafından tercih edilen en yüksek çözünürlük. | ||
Maksimum çözünürlük: Kamera cihazının JPEG biçimindeki maksimum çıkış çözünürlüğü. Bu bilgiyi almak için StreamConfigurationMap.getOutputSizes() seçeneğini kullanın.
|
Çözünürlük belirtin
Aşağıdaki kod örneğinde gösterildiği gibi, setTargetResolution(Size resolution)
yöntemini kullanarak kullanım alanları oluştururken belirli çözünürlükler ayarlayabilirsiniz:
Kotlin
val imageAnalysis = ImageAnalysis.Builder() .setTargetResolution(Size(1280, 720)) .build()
Java
ImageAnalysis imageAnalysis = new ImageAnalysis.Builder() .setTargetResolution(new Size(1280, 720)) .build();
Aynı kullanım alanında hem hedef en boy oranını hem de hedef çözünürlüğü ayarlayamazsınız. Bu işlem, yapılandırma derlenirken bir IllegalArgumentException
hatası verir
nesnesini tanımlayın.
Çözünürlüğü Size
koordinatta ifade edin
çerçeve içine alın. Örneğin,
doğal hedef rotasyonunda dikey doğal yönlü cihaz
dikey resim 480x640 çözünürlüğü belirtebilir ve aynı cihaz 90 derece döndürülmüş ve
hedef yatay yön 640x480 belirtebilir.
Hedef çözünürlük, resim çözünürlüğü için minimum bir sınır belirlemeye çalışır. Gerçek resim çözünürlüğü, kullanılabilir olan en yakın çözünürlükdür. ekran görüntüsünde belirtilen hedef çözünürlükten daha küçük olmayan bir boyuta Kamera kullanımı.
Ancak,
hedef çözünürlükten daha büyük, mevcut çözünürlükten daha küçük olan en yakın
hedef çözünürlük seçilir. Şu en boy oranına sahip çözünürlük:
sağlanan Size
, farklı çözünürlüklerden daha yüksek önceliğe sahip
en boy oranları.
CameraX, isteklere göre en uygun çözünürlüğü uygular. Öğe
birincil ihtiyaç, en boy oranını karşılamaktır, yalnızca setTargetAspectRatio
belirtin.
ve CameraX, cihaza uygun belirli bir çözünürlük belirler.
Uygulamanın birincil ihtiyacı görüntü oluşturmak için bir çözünürlük belirtmekse
daha verimli bir şekilde işlenmesini sağlar (örneğin,
işlem özelliği) setTargetResolution(Size resolution)
kullanın.
Uygulamanız tam bir çözünürlük gerektiriyorsa
createCaptureSession()
her donanım düzeyinde hangi maksimum çözünürlüklerin desteklendiğini belirleyin. Mevcut cihazın desteklediği çözünürlükleri kontrol etmek için StreamConfigurationMap.getOutputSizes(int)
bölümüne bakın.
Uygulamanız Android 10 veya sonraki bir sürümde çalışıyorsa belirli bir SessionConfiguration
'ı doğrulamak için isSessionConfigurationSupported()
'i kullanabilirsiniz.
Kamera çıkışını kontrol etme
CameraX, kamera çıkışını her bir kullanım alanı için gerektiği gibi yapılandırmanıza olanak tanımanın yanı sıra, bağlı tüm kullanım alanlarında ortak olan kamera işlemlerini desteklemek için aşağıdaki arayüzleri de uygular:
CameraControl
, yaygın kamera özelliklerini yapılandırmanıza olanak tanır.CameraInfo
, Google Haritalar'daki durumunu öğrenebilirsiniz.
CameraControl'de desteklenen kamera özellikleri şunlardır:
- Yakınlaştırma
- Flaş
- Odak ve Ölçme (dokunarak odaklama)
- Pozlama Telafisi
CameraControl ve CameraInfo örneklerini alma
ProcessCameraProvider.bindToLifecycle()
tarafından döndürülen Camera
nesnesini kullanarak CameraControl
ve CameraInfo
örneklerini alın.
Aşağıdaki kodda bir örnek gösterilmektedir:
Kotlin
val camera = processCameraProvider.bindToLifecycle(lifecycleOwner, cameraSelector, preview) // For performing operations that affect all outputs. val cameraControl = camera.cameraControl // For querying information and states. val cameraInfo = camera.cameraInfo
Java
Camera camera = processCameraProvider.bindToLifecycle(lifecycleOwner, cameraSelector, preview) // For performing operations that affect all outputs. CameraControl cameraControl = camera.getCameraControl() // For querying information and states. CameraInfo cameraInfo = camera.getCameraInfo()
Örneğin, bindToLifecycle()
çağrısından sonra yakınlaştırma ve diğer CameraControl
işlemlerini gönderebilirsiniz. Kamera örneğini bağlamak için kullanılan etkinliği durdurduğunuzda veya yok ettiğinizde CameraControl
artık işlem yapamaz ve başarısız bir ListenableFuture
döndürür.
Yakınlaştırma
CameraControl, yakınlaştırma düzeyini değiştirmek için iki yöntem sunar:
setZoomRatio()
yakınlaştırma oranını yakınlaştırma oranına göre ayarlar.Oran
CameraInfo.getZoomState().getValue().getMinZoomRatio()
ileCameraInfo.getZoomState().getValue().getMaxZoomRatio()
arasında olmalıdır. Aksi takdirde işlev başarısız birListenableFuture
döndürür.setLinearZoom()
, geçerli yakınlaştırmayı 0 ile 1,0 arasında değişen doğrusal bir yakınlaştırma değeriyle ayarlar.Doğrusal yakınlaştırmanın avantajı, görüş alanını (FOV) net bir şekilde yakınlaşmadaki değişikliklerle ölçeklenir. Bu nedenle, belirli bir ürünle
Slider
görünümü.
CameraInfo.getZoomState()
mevcut yakınlaştırma durumunun LiveData'sını döndürür. Değer, kamera
başlatıldıysa veya yakınlaştırma düzeyi setZoomRatio()
setLinearZoom()
. Bu yöntemlerden herhangi biri çağrıldığında ZoomState.getZoomRatio()
ve ZoomState.getLinearZoom()
için destekleyici değerler ayarlanır.
Bu, kaydırma çubuğunun yanında yakınlaştırma oranı metnini görüntülemek istiyorsanız yararlı olur.
Dönüşüm yapmanıza gerek kalmadan her ikisini de güncellemek için ZoomState
LiveData
değerini gözlemlemeniz yeterlidir.
Her iki API'nin döndürdüğü ListenableFuture
, uygulamalar için seçenek sunar
Belirtilen yakınlaştırma değerine sahip tekrarlanan bir istek olduğunda bilgilendirilmek için
tamamlandı. Buna ek olarak, önceki işlem sırasında yeni bir yakınlaştırma değeri ayarlarsanız
hâlâ yürütülüyor, önceki yakınlaştırma işleminin ListenableFuture
değeri başarısız oluyor
hemen teslim edebilirsiniz.
Flaş
CameraControl.enableTorch(boolean)
el fenerini (işaret ışığı olarak da bilinir) etkinleştirir veya devre dışı bırakır.
CameraInfo.getTorchState()
mevcut flaş durumunu sorgulamak için kullanılabilir. Döndürülen değeri kontrol edebilirsiniz.
-
CameraInfo.hasFlashUnit()
fener olup olmadığını belirleyin. Değilse telefonla aramak
CameraControl.enableTorch(boolean)
, döndürülen ListenableFuture
değerinin
başarısız bir sonuçla hemen tamamlar ve lamba durumunu
TorchState.OFF
.
El feneri etkinleştirildiğinde, flashMode ayarından bağımsız olarak fotoğraf ve video çekimi sırasında açık kalır. İlgili içeriği oluşturmak için kullanılan
flashMode
inç
ImageCapture
yalnızca flaş devre dışıyken çalışır.
Odak ve Ölçüm
CameraControl.startFocusAndMetering()
AF/AE/AWB ölçüm bölgelerini ayarlayarak otomatik odaklama ve pozlama sayacını tetikler
buna göre çalışır. Bu yöntem genellikle
özelliğini kullanabilirsiniz.
MeteringPoint
Başlamak için MeteringPointFactory.createPoint(float x, float y, float
size)
kullanarak bir MeteringPoint
oluşturun.
MeteringPoint
, kameradaki tek bir noktayı temsil ederSurface
. AF/AE/AWB bölgelerini belirtmek için sensör koordinatlarına kolayca dönüştürülebilmesi amacıyla normalleştirilmiş bir biçimde saklanır.
MeteringPoint
öğesinin boyutu, varsayılan boyutla 0 ile 1 arasında değişir.
0,15f. MeteringPointFactory.createPoint(float x, float y, float
size)
çağrılırken, CameraX sağlanan alan için (x, y)
bölgesinde ortalanmış bir dikdörtgen bölge oluşturur
size
.
Aşağıdaki kodda, MeteringPoint
öğesinin nasıl oluşturulacağı gösterilmektedir:
Kotlin
// Use PreviewView.getMeteringPointFactory if PreviewView is used for preview. previewView.setOnTouchListener((view, motionEvent) -> { val meteringPoint = previewView.meteringPointFactory .createPoint(motionEvent.x, motionEvent.y) … } // Use DisplayOrientedMeteringPointFactory if SurfaceView / TextureView is used for // preview. Please note that if the preview is scaled or cropped in the View, // it’s the application's responsibility to transform the coordinates properly // so that the width and height of this factory represents the full Preview FOV. // And the (x,y) passed to create MeteringPoint might need to be adjusted with // the offsets. val meteringPointFactory = DisplayOrientedMeteringPointFactory( surfaceView.display, camera.cameraInfo, surfaceView.width, surfaceView.height ) // Use SurfaceOrientedMeteringPointFactory if the point is specified in // ImageAnalysis ImageProxy. val meteringPointFactory = SurfaceOrientedMeteringPointFactory( imageWidth, imageHeight, imageAnalysis)
startFocusAndMetering ve FocusMeteringAction
Çağırmak için
startFocusAndMetering()
,
uygulamaların bir sonraki
FocusMeteringAction
,
isteğe bağlı sayaç moduyla bir veya daha fazla MeteringPoints
içeren
şuradan kombinasyonlar:
FLAG_AF
,
FLAG_AE
,
FLAG_AWB
. İlgili içeriği oluşturmak için kullanılan
aşağıdaki kod bu kullanımı gösterir:
Kotlin
val meteringPoint1 = meteringPointFactory.createPoint(x1, x1) val meteringPoint2 = meteringPointFactory.createPoint(x2, y2) val action = FocusMeteringAction.Builder(meteringPoint1) // default AF|AE|AWB // Optionally add meteringPoint2 for AF/AE. .addPoint(meteringPoint2, FLAG_AF | FLAG_AE) // The action is canceled in 3 seconds (if not set, default is 5s). .setAutoCancelDuration(3, TimeUnit.SECONDS) .build() val result = cameraControl.startFocusAndMetering(action) // Adds listener to the ListenableFuture if you need to know the focusMetering result. result.addListener({ // result.get().isFocusSuccessful returns if the auto focus is successful or not. }, ContextCompat.getMainExecutor(this)
Önceki kodda gösterildiği gibi, startFocusAndMetering()
, AF/AE/AWB ölçüm bölgeleri için bir MeteringPoint
ve yalnızca AF ve AE için başka bir MeteringPoint içeren bir FocusMeteringAction
alır.
KameraX dahili olarak bunu Camera2'ye dönüştürür
MeteringRectangles
ve ilgili parametrelerin
CONTROL_AF_REGIONS
/
CONTROL_AE_REGIONS
/
CONTROL_AWB_REGIONS
parametrelerini yakalama isteğine ekleyin.
Her cihaz AF/AE/AWB'yi ve birden fazla bölgeyi desteklemediğinden CameraX, FocusMeteringAction
işlevini en iyi şekilde yürütür. CameraX, desteklenen maksimum sayıda MeteringPoints değerini, noktaların eklenme sırasına göre kullanır. Maksimum sayıdan sonra eklenen tüm MeteringPoints yoksayılır. Örneğin, yalnızca 2'yi destekleyen bir platformda bir FocusMeteringAction
'ye 3 MeteringPoint sağlanırsa yalnızca ilk 2 MeteringPoint kullanılır. Son MeteringPoint
CameraX tarafından yoksayıldı.
Pozlama Telafisi
Pozlama dengelemesi, uygulamaların pozlamada ince ayar yapması gerektiğinde kullanışlıdır otomatik pozlama (AE) çıkış sonucunun ötesindeki değerlere (EV) eşittir. Pozlama telafisi değerleri, mevcut görüntü koşulları için gerekli pozlamayı belirlemek üzere aşağıdaki şekilde birleştirilir:
Exposure = ExposureCompensationIndex * ExposureCompensationStep
CameraX,
Camera.CameraControl.setExposureCompensationIndex()
pozlama telafisini dizin değeri olarak ayarlamak için kullanılır.
Pozitif indeks değerleri resmi daha parlak hale getirirken negatif değerler resmi soluklaştırır
görüntüsüdür. Uygulamalar, desteklenen aralığı aşağıdaki şekilde sorgulayabilir:
CameraInfo.ExposureState.exposureCompensationRange()
sonraki bölümde açıklanmıştır. Değer destekleniyorsa döndürülen
ListenableFuture
değer,
yakalama isteği; belirtilen dizin desteklenen aralığın dışındaysa
setExposureCompensationIndex()
, döndürülen ListenableFuture
değerinin
başarısız bir sonuçla hemen tamamlanır.
CameraX yalnızca en son olağanüstü setExposureCompensationIndex()
içeriğini saklar
isteğine ve önceki istekten önce işlevin birden çok kez çağrılması
uygulanması iptal edilmesine neden olur.
Aşağıdaki snippet, bir karşılaşma tazminat dizini ayarlar ve bir karşılaşma değişikliği isteği yürütüldüğünde geri çağırma:
Kotlin
camera.cameraControl.setExposureCompensationIndex(exposureCompensationIndex) .addListener({ // Get the current exposure compensation index, it might be // different from the asked value in case this request was // canceled by a newer setting request. val currentExposureIndex = camera.cameraInfo.exposureState.exposureCompensationIndex … }, mainExecutor)
Camera.CameraInfo.getExposureState()
alırExposureState
şunları içerir:- Pozlama dengeleme kontrolünün desteklenebilirliği.
- Mevcut pozlama telafisi indeksi.
- Pozlama telafisi dizini aralığı.
- Pozlama telafisi değeri hesaplamasında kullanılan pozlama telafisi adımı.
Örneğin, aşağıdaki kod bir gösterim SeekBar
için ayarları mevcut ExposureState
değerleriyle başlatır:
Kotlin
val exposureState = camera.cameraInfo.exposureState binding.seekBar.apply { isEnabled = exposureState.isExposureCompensationSupported max = exposureState.exposureCompensationRange.upper min = exposureState.exposureCompensationRange.lower progress = exposureState.exposureCompensationIndex }
Ek kaynaklar
CameraX hakkında daha fazla bilgi edinmek için aşağıdaki ek kaynaklara bakın.
Kod Laboratuvarı
Kod örneği
Geliştirici topluluğu
Android CameraX Tartışma Grubu