5

我正在关注 CameraX代码实验室,并在 Android Studio 中查看了他们的示例应用程序和源代码,但似乎没有办法冻结或锁定TextureView显示预览帧的内容。

在 Camera2 API 中,我们可以调用类似的东西cameraCaptureSession?.stopRepeating(),然后TextureView将停止从相机获取输入。

我冻结预览的用例是向用户显示当前正在保存的图像,因为我在TextureView.

4

2 回答 2

13
// You can unbind from any UseCase
CameraX.unbind(previewUseCase)
// In this way TextureView will hold the last frame


 // for version 1.0.0-alpha07
 cameraProvider.unbind(preview);
于 2019-05-21T13:42:02.103 回答
1

您可以使用PreviewView.getBitmap()捕捉预览屏幕上显示的最新图像。它非常快,您甚至不必旋转或翻转图像。

我的 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"/>

我以前的代码,处理来自OnImageCapturedCallbackor的图像OnImageSavedCallback

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

当前代码,使用后PreviewView.getBitmap()

val bitmap = viewFinder.getBitmap()

showCapturedImage(bitmap)

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

如果您打算使用 保存图像OnImageSavedCallback,请记住,PreviewView.getBitmap()保存的文件可能会稍有延迟,OnImageSavedCallback因此这两个图像可能会有所不同,具体取决于延迟。

于 2021-02-24T03:44:03.130 回答