使用 TextureView 旋转相机流会裁剪图像
Rotating camera stream with TextureView crops the image
我正在使用的设备中的相机 returns 旋转图像(横向 16:9)。为了获取流,我使用 Camera2 API and for projection I use TextureView。 TextureView
是固定大小。当我尝试使用 Matrix
旋转它时,它会导致图像被裁剪。
这是轮换前的内容:
然后我旋转它并像这样调整 TextureView
大小:
private fun updateTransform() {
val matrix = Matrix()
val centerX = textureView.width / 2f
val centerY = textureView.height / 2f
matrix.postRotate(90.toFloat(), centerX, centerY)
textureView.setTransform(matrix)
textureView.layoutParams = FrameLayout.LayoutParams(textureView.width, textureView.height)
}
结果如下图:
我想要拉伸图像以填充 TextureView
。需要注意的重要一点是,我不需要考虑设备旋转,因为它始终是纵向的。我也只为一台设备编程,所以我不需要考虑不同的相机类型等。
如何在不裁剪图像的情况下旋转图像?
这个转换解决了我的问题:
private fun transformTexture() {
val adjustment = Matrix()
val centerX = textureView.width / 2f
val centerY = textureView.height / 2f
val scalex = textureView.width.toFloat() / textureView.height.toFloat()
val scaley = textureView.height.toFloat() / textureView.width.toFloat()
adjustment.postRotate(90F, centerX, centerY)
adjustment.postScale(scalex, scaley, centerX, centerY)
textureView.setTransform(adjustment)
}
我正在使用的设备中的相机 returns 旋转图像(横向 16:9)。为了获取流,我使用 Camera2 API and for projection I use TextureView。 TextureView
是固定大小。当我尝试使用 Matrix
旋转它时,它会导致图像被裁剪。
这是轮换前的内容:
然后我旋转它并像这样调整 TextureView
大小:
private fun updateTransform() {
val matrix = Matrix()
val centerX = textureView.width / 2f
val centerY = textureView.height / 2f
matrix.postRotate(90.toFloat(), centerX, centerY)
textureView.setTransform(matrix)
textureView.layoutParams = FrameLayout.LayoutParams(textureView.width, textureView.height)
}
结果如下图:
我想要拉伸图像以填充 TextureView
。需要注意的重要一点是,我不需要考虑设备旋转,因为它始终是纵向的。我也只为一台设备编程,所以我不需要考虑不同的相机类型等。
如何在不裁剪图像的情况下旋转图像?
这个转换解决了我的问题:
private fun transformTexture() {
val adjustment = Matrix()
val centerX = textureView.width / 2f
val centerY = textureView.height / 2f
val scalex = textureView.width.toFloat() / textureView.height.toFloat()
val scaley = textureView.height.toFloat() / textureView.width.toFloat()
adjustment.postRotate(90F, centerX, centerY)
adjustment.postScale(scalex, scaley, centerX, centerY)
textureView.setTransform(adjustment)
}