2画面旋转_Android相机开发 - 预览画面的旋转

本文探讨了Android相机预览画面可能出现的旋转问题及其原因,包括摄像头传感器的安装角度和手机屏幕的角度。提供了获取和计算恢复角度的方法,以及如何使用恢复角度来矫正Camera1和Camera2的预览和照片保存角度,确保兼容性。
摘要由CSDN通过智能技术生成

c98a04c9b875bc54aa72ac37bb93ef2e.png

Android 相机打开预览后,可能存在旋转90/180/270度的问题,也会影我们计算预览尺寸,应该怎么处理呢?

由于大部分手机都是旋转了90度,导致很多开发者直接把预览画面转90度回去,出现兼容问题,这是不对的。

预览角度旋转的原因:

(1) 摄像头传感器在安装时就和屏幕竖直方向存在夹角(orientation),大部分手机为90度;

(2) 手机会横竖屏切换,导致手机屏幕的上方向和手机物理的上方向也有一个角度(rotation)。

下面我们看如何恢复画面的预览:


1. 获取相机传感器的安装角度

安装角度是指手机自然状态下的上方向与摄像头的上方向的夹角,方向是从摄像头的上方向逆时针旋转到手机的上方向。

2f548c3e4913b681e48ec829606fe880.png

Camera1:

fun getCameraOrientation(cameraID: Int): Int {
    val info = new Camera.CameraInfo()
    Camera.getCameraInfo(cameraID, info)
    return info.orientation
}

Camera2:

fun getCameraOrientation(context: Context, cameraID: Int): Int {
    val manager = context.getSystemService(Context.CAMERA_SERVICE) as CameraManager
    // 获取该相机的特征
    val properties = manager.getCameraCharacteristics(cameraID)
    // 获取相机配置
    val config = properties.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP)
    // 获取旋转角度
    return characteristics.get(CameraCharacteristics.SENSOR_ORIENTATION)
}

2. 获取手机屏幕的角度

屏幕的角度是指手机自然状态下的上方向与当前画面上方向的夹角。方向是从画面上方向逆时针旋转到手机上方向。

c25ed2f6caedb6aebe7cc825cd335dd3.png
fun displayRotation(context: Context): Int {
    return when(context.windowManager.defaultDisplay.rotation) {
        Surface.ROTATION_0   -> 0
        Surface.ROTATION_90  -> 90
        Surface.ROTATION_180 -> 180
        Surface.ROTATION_270 -> 270
        else -> 0
    }
}

3. 计算恢复角度

通过两个角度的定义,我们很容易知道怎么旋转可以把画面恢复:

val angle = (orientation - rotation + 360) % 360

4. 使用恢复角度

  • 用于矫正 Camera1 的预览角度:
camera.setDisplayOrientation(angle)
  • 用于矫正 Camera1 的照片保存角度: Camera1 通过设置 Parameters 矫正照片保存角度:
val camera: Camera = ...
val params = camera.getParameters()
params.setRotation(angle)
camera.setParameters(params)
  • 用于矫正 Camera2 的照片保存角度: Camera2 在创建 CaptureRequest 时设置照片保存角度:
val builder = camera.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE)
builder.set(CaptureRequest.JPEG_ORIENTATION, angle)

Camera2 在预览时会自动矫正预览角度。

在挑选预览画面尺寸时,也是需要用到这个角度的。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值