Как заблокировать / заморозить предварительный просмотр CameraX TextureView?

Я следую за лабораторией кода CameraX, а также посмотрел их пример приложения и исходный код в Android Studio, но, похоже, нет способа заморозить или заблокировать TextureView это показывает предварительный просмотр кадров.

В API Camera2 мы можем просто вызвать что-то вроде cameraCaptureSession?.stopRepeating() и TextureView перестанет получать входные данные с камеры.

Мой сценарий использования для замораживания предварительного просмотра - показать пользователю изображение, которое в данный момент сохраняется, когда я добавляю другие анимации поверх TextureView,

2 ответа

Решение
// You can unbind from any UseCase
CameraX.unbind(previewUseCase)
// In this way TextureView will hold the last frame

Вы можете использовать для захвата последнего изображения, которое появляется на экране предварительного просмотра. Это очень быстро, и вам даже не нужно поворачивать или переворачивать изображение.

мой код XML:

              <androidx.camera.view.PreviewView
            android:id="@+id/viewFinder"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            app:layout_constraintDimensionRatio="3:3"
            app:layout_constraintTop_toTopOf="parent"/>

        <ImageView
            android:visibility="gone"
            android:id="@+id/ivPreview"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            app:layout_constraintDimensionRatio="3:3"
            app:layout_constraintTop_toTopOf="parent"/>

мой предыдущий код, обрабатывающий изображение из OnImageCapturedCallback или же :

      private fun showCapturedImage(bitmap: Bitmap, rotationDegrees: Float) {
        viewFinder.visibility = View.GONE
        ivPreview.visibility = View.VISIBLE
        var rotatedBitmap = ImageUtils.rotateImage(bitmap, rotationDegrees).toSquare()
        if (isTakeFacePhoto){
            rotatedBitmap = rotatedBitmap.flipBitmap()
        }
        ivPreview.setImageBitmap(rotatedBitmap)
    }

текущий код после использования:

      val bitmap = viewFinder.getBitmap()

showCapturedImage(bitmap)

private fun showCapturedImage(bitmap: Bitmap) {
           viewFinder.visibility = View.GONE
           ivPreview.visibility = View.VISIBLE
           ivPreview.setImageBitmap(bitmap)
}

Если вы планируете сохранить изображение с помощью, имейте в виду, что может быть небольшая задержка с PreviewView.getBitmap() и сохраненный файл из OnImageSavedCallback поэтому эти два изображения могут действительно отличаться в зависимости от задержки.

Другие вопросы по тегам