What's new in CameraX 1.4.0 and a sneak peek of Jetpack Compose support
Вышла новая версия CameraX 1.4.0. Давайте посмотрим, что внутри:
🔸 В 1.4.0 добавили HDR-предпросмотр и Ultra HDR
🔸 HDR-предпросмотр позволяет включать HDR в Preview без необходимости привязывать VideoCapture
🔸 Чтобы полностью включить HDR, необходимо убедиться, что OpenGL способен обрабатывать определенный формат динамического диапазона:
val openGLPipelineSupportedDynamicRange = setOf(
DynamicRange.SDR,
DynamicRange.HLG_10_BIT
)
val isHlg10Supported =
cameraProvider.getCameraInfo(cameraSelector)
.querySupportedDynamicRanges(openGLPipelineSupportedDynamicRange)
.contains(DynamicRange.HLG_10_BIT)
val preview = Preview.Builder().apply {
if (isHlg10Supported) {
setDynamicRange(DynamicRange.HLG_10_BIT)
}
}
🔸 Ultra HDR добавить в пару строк кода:
val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA
val cameraInfo = cameraProvider.getCameraInfo(cameraSelector)
val isUltraHdrSupported =
ImageCapture.getImageCaptureCapabilities(cameraInfo)
.supportedOutputFormats
.contains(ImageCapture.OUTPUT_FORMAT_JPEG_ULTRA_HDR)
val imageCapture = ImageCapture.Builder().apply {
if (isUltraHdrSupported) {
setOutputFormat(ImageCapture.OUTPUT_FORMAT_JPEG_ULTRA_HDR)
}
}.build()
🔸 Добавили поддержку Composable Viewfinder, созданного на основе AndroidExternalSurface и AndroidEmbeddedExternalSurface:
class PreviewViewModel : ViewModel() {
private val _surfaceRequests = MutableStateFlow(null)
val surfaceRequests: StateFlow
get() = _surfaceRequests.asStateFlow()
private fun produceSurfaceRequests(previewUseCase: Preview) {
previewUseCase.setSurfaceProvider { newSurfaceRequest ->
_surfaceRequests.value = newSurfaceRequest
}
}
// ...
}
@Composable
fun MyCameraViewfinder(
viewModel: PreviewViewModel,
modifier: Modifier = Modifier
) {
val currentSurfaceRequest: SurfaceRequest? by
viewModel.surfaceRequests.collectAsState()
currentSurfaceRequest?.let { surfaceRequest ->
CameraXViewfinder(
surfaceRequest = surfaceRequest,
implementationMode = ImplementationMode.EXTERNAL, // Or EMBEDDED
modifier = modifier
)
}
}
🔸 В версии 1.4.0 представили две новые suspend функции для упрощения инициализации камеры и захвата изображения:
val cameraProvider = ProcessCameraProvider.awaitInstance()
val imageProxy = imageCapture.takePicture()
imageProxy.close()
🔸 Добавили mirror mode для превью через Preview.Builder.setMirrorMode
🔸 Наложение эффектов в реальном времени. Доступен набор стандартных эффектов: Overlay Effect и Media3 Effect:
val media3Effect =
Media3Effect(
requireContext(), PREVIEW or VIDEO_CAPTURE or IMAGE_CAPTURE,
mainThreadExecutor(), {}
)
media3Effect.setEffects(listOf(RgbFilter.createGrayscaleFilter())
cameraController.setEffects(setOf(media3Effect))
🔸 Представлена новая мощная фича – вспышка экрана. Вспышка экрана использует дисплей телефона:
previewView.setScreenFlashWindow(activity.getWindow());
imageCapture.screenFlash = previewView.screenFlash
imageCapture.setFlashMode(ImageCapture.FLASH_MODE_SCREEN)
Вышла новая версия CameraX 1.4.0. Давайте посмотрим, что внутри:
🔸 В 1.4.0 добавили HDR-предпросмотр и Ultra HDR
🔸 HDR-предпросмотр позволяет включать HDR в Preview без необходимости привязывать VideoCapture
🔸 Чтобы полностью включить HDR, необходимо убедиться, что OpenGL способен обрабатывать определенный формат динамического диапазона:
val openGLPipelineSupportedDynamicRange = setOf(
DynamicRange.SDR,
DynamicRange.HLG_10_BIT
)
val isHlg10Supported =
cameraProvider.getCameraInfo(cameraSelector)
.querySupportedDynamicRanges(openGLPipelineSupportedDynamicRange)
.contains(DynamicRange.HLG_10_BIT)
val preview = Preview.Builder().apply {
if (isHlg10Supported) {
setDynamicRange(DynamicRange.HLG_10_BIT)
}
}
🔸 Ultra HDR добавить в пару строк кода:
val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA
val cameraInfo = cameraProvider.getCameraInfo(cameraSelector)
val isUltraHdrSupported =
ImageCapture.getImageCaptureCapabilities(cameraInfo)
.supportedOutputFormats
.contains(ImageCapture.OUTPUT_FORMAT_JPEG_ULTRA_HDR)
val imageCapture = ImageCapture.Builder().apply {
if (isUltraHdrSupported) {
setOutputFormat(ImageCapture.OUTPUT_FORMAT_JPEG_ULTRA_HDR)
}
}.build()
🔸 Добавили поддержку Composable Viewfinder, созданного на основе AndroidExternalSurface и AndroidEmbeddedExternalSurface:
class PreviewViewModel : ViewModel() {
private val _surfaceRequests = MutableStateFlow(null)
val surfaceRequests: StateFlow
get() = _surfaceRequests.asStateFlow()
private fun produceSurfaceRequests(previewUseCase: Preview) {
previewUseCase.setSurfaceProvider { newSurfaceRequest ->
_surfaceRequests.value = newSurfaceRequest
}
}
// ...
}
@Composable
fun MyCameraViewfinder(
viewModel: PreviewViewModel,
modifier: Modifier = Modifier
) {
val currentSurfaceRequest: SurfaceRequest? by
viewModel.surfaceRequests.collectAsState()
currentSurfaceRequest?.let { surfaceRequest ->
CameraXViewfinder(
surfaceRequest = surfaceRequest,
implementationMode = ImplementationMode.EXTERNAL, // Or EMBEDDED
modifier = modifier
)
}
}
🔸 В версии 1.4.0 представили две новые suspend функции для упрощения инициализации камеры и захвата изображения:
val cameraProvider = ProcessCameraProvider.awaitInstance()
val imageProxy = imageCapture.takePicture()
imageProxy.close()
🔸 Добавили mirror mode для превью через Preview.Builder.setMirrorMode
🔸 Наложение эффектов в реальном времени. Доступен набор стандартных эффектов: Overlay Effect и Media3 Effect:
val media3Effect =
Media3Effect(
requireContext(), PREVIEW or VIDEO_CAPTURE or IMAGE_CAPTURE,
mainThreadExecutor(), {}
)
media3Effect.setEffects(listOf(RgbFilter.createGrayscaleFilter())
cameraController.setEffects(setOf(media3Effect))
🔸 Представлена новая мощная фича – вспышка экрана. Вспышка экрана использует дисплей телефона:
previewView.setScreenFlashWindow(activity.getWindow());
imageCapture.screenFlash = previewView.screenFlash
imageCapture.setFlashMode(ImageCapture.FLASH_MODE_SCREEN)