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:
takePicture(Executor, OnImageCapturedCallback)
: este método fornece um buffer na memória da imagem capturada.takePicture(OutputFileOptions, Executor, OnImageSavedCallback)
: este método salva a imagem capturada no local do arquivo fornecido.
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 oOnImageCapturedCallback()
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:
CAPTURE_MODE_MINIMIZE_LATENCY
: otimizar a captura de imagem para latência.CAPTURE_MODE_MAXIMIZE_QUALITY
: otimizar a captura para a qualidade da imagem.
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()
:
FLASH_MODE_ON
: o flash está sempre ativado.FLASH_MODE_AUTO
: o flash é ativado automaticamente para fotos com pouca luz.
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
Exemplo de código