Captura de imagem

O caso de uso de captura de imagem foi projetado para a captura de fotos de alta resolução e qualidade e oferece recursos de equilíbrio de branco, exposição e foco automáticos (3A), além de controles de câmera manuais simples. O autor da chamada é responsável por decidir como usar a imagem capturada, incluindo as opções a seguir:

Há dois tipos de executores personalizáveis em que ImageCapture é executado, o de callback e o de pedido de veiculação.

  • O executor de callback é o parâmetro dos métodos takePicture. Ele é usado para executar o OnImageCapturedCallback() fornecido pelo usuário.
  • Se o autor da chamada escolher salvar a imagem em um local de arquivo, você poderá especificar um executor para fazer o pedido de inserção. Para definir o executor de pedido de veiculação, chame ImageCapture.Builder.setIoExecutor(Executor). Se o executor estiver ausente, o CameraX adotará como padrão um executor interno de pedido de veiculação para a tarefa.

Configurar a captura de imagens

A captura de imagens oferece controles básicos para tirar fotos, como flash, autofoco contínuo, nenhum atraso do obturador e muito mais.

setCaptureMode()

Use ImageCapture.Builder.setCaptureMode() para configurar o modo de captura ao tirar uma foto:

O modo de captura é definido por padrão como CAPTURE_MODE_MINIMIZE_LATENCY. Para saber mais, consulte a documentação de referência do setCaptureMode().

Sem atraso do obturador

Na versão 1.2 e mais recentes, o recurso "Sem atraso do obturador" (CAPTURE_MODE_ZERO_SHOT_LAG) está disponível como modo de captura. Com ele ativado, a latência é reduzida significativamente em comparação com o modo de captura padrão, CAPTURE_MODE_MINIMIZE_LATENCY, para que você nunca perca um clique.

O "Sem atraso do obturador" usa um buffer de anel que armazena os três frames de captura mais recentes. Quando um usuário pressiona o botão de captura, o CameraX invoca takePicture(), e o buffer de anel extrai o frame capturado com o carimbo de data/hora mais próximo do pressionamento do botão. Em seguida, o CameraX reprocessa a sessão de captura para gerar uma imagem nesse frame, que é salva em disco no formato JPEG.

Pré-requisitos

Antes de ativar o recurso "Sem atraso do obturador", use isZslSupported() para determinar se o dispositivo atende a estes requisitos:

  • É direcionado ao Android 6.0 ou mais recente (nível 23 da API e versões mais recentes).
  • Oferece suporte a reprocessamento do PRIVATE.

Para dispositivos que não atendem aos requisitos mínimos, o CameraX volta para CAPTURE_MODE_MINIMIZE_LATENCY.

Esse modo não está disponível para o caso de uso de captura de imagens. Não é possível ativá-lo para o caso de uso de captura de vídeo ou com extensões da câmera. Por fim, como o uso do flash resulta em maior latência, o recurso "Sem atraso do obturador" não funciona quando o flash está ativado ou no modo AUTOMÁTICO. Para saber mais sobre como configurar o modo do flash, consulte setFlashMode().

Ativar o recurso "Sem atraso do obturador"

Para ativar o recurso Sem atraso do obturador, transmita CAPTURE_MODE_ZERO_SHOT_LAG para ImageCapture.Builder.setCaptureMode(). Se falhar, o método setCaptureMode() vai voltar para CAPTURE_MODE_MINIMIZE_LATENCY.

setFlashMode().

O modo do flash padrão é FLASH_MODE_OFF. Para definir o modo do flash, use ImageCapture.Builder.setFlashMode():

Tirar foto

Confira no exemplo de código abaixo como configurar seu app para tirar uma foto:

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);

Observe que bindToLifecycle() retorna um objeto Camera. Consulte este guia para ver mais informações sobre como controlar a saída da câmera, por exemplo, zoom e exposição.

Depois de configurar a câmera, o código a seguir tira uma foto quando o usuário solicita:

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.
            }
       }
    );
}

O método de captura de imagem oferece suporte total ao formato JPEG. Para conferir o exemplo de código e saber como converter um objeto Media.Image de YUV_420_888 para um objeto no formato RGB Bitmap, consulte YuvToRgbConverter.kt (link em inglês).

Outros recursos

Para saber mais sobre o CameraX, consulte os recursos a seguir.

Codelab

  • Introdução ao CameraX
  • Exemplo de código

  • Apps de exemplo do CameraX (link em inglês)