Android camera2拍照旋转角度详解

本文详细讲述了在使用Android camera2进行自定义相机开发时遇到的传感器旋转角度问题,如何根据手机横竖屏判断并调整输出图片的orientation,以及拍照时的策略优化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近用Android camera2做自定义相机,基本的关于打开相机到预览的过程就不多叙述了

大家参看https://github.com/gengqifu/361Camera这个文章就可以知道

今天详细讲讲我开过程中遇到的旋转角度的问题

直接上代码

//初始化传感器定位

orientationEventListener = object : OrientationEventListener(mActivity) {
            override fun onOrientationChanged(orientation: Int) {
                Log.e("orientation", "orientation=$orientation")
                sensorOrientation = when (orientation) {
                    -1 -> ORIENTATION_VERTICAL
                    in 70..134 -> 90
                    in 135..224 -> 180
                    in 225..280 -> 270
                    else -> 0 //这里应该是281-69的范围
                }
            }
        }
        orientationEventListener.enable()

这就是相机中  传感器定位的回调代码,是kotlin的代码。

代码以一个竖直平面,360度内旋转

正常应该是以45-134  135-224 225-314  315-45  这样4个区间

每90度一个区间平均分,但是实际开发中 我们判断为横屏拍照时,手机几乎得是旋转90度  才代表用户是横屏 

所以我加大了orientation为0的这样一个角度区间  减小了orientation为90和270的这样一个区间(判定为横屏拍照的区间)。

因此可以根据需求,调整你的区间  达到需求的目的。

上面是我们手机在竖直拍照时,水平拍照时怎么处理喃?

大家看到我的log日志中有个orientation为-1,这说明手机这时候已经水平放置了

这个时候你在水平面内  左右旋转这个orientation都不会改变  都是-1

因此我们在-1的时候,其实就默认是竖屏拍照就可以了,这是一个很容易忽略的点

 val captureBuilder = cameraDevice?.createCaptureRequest(
                CameraDevice.TEMPLATE_STILL_CAPTURE
            )?.apply {
                if (::previewImageReaderSurface.isInitialized) {
                    addTarget(previewImageReaderSurface)
                }
                set(
                    CaptureRequest.JPEG_ORIENTATION,
                    CameraUtil.getJpegOrientation(
                        CameraConfig.getCurrentCameraCameraCharacteristics(),
                        sensorOrientation
                    )
                )
                if (lightIsOpened()) {
                    set(CaptureRequest.CONTROL_AE_MODE, 
                       CaptureRequest.CONTROL_AE_MODE_ON)
                    set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_TORCH)
                } else {
                    set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_OFF)
                }
                set(
                    CaptureRequest.CONTROL_AE_MODE,
                    CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH
                )
                set(
                    CaptureRequest.CONTROL_AF_MODE,
                    CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE
                )
                //锁定焦点
                set(
                    CaptureRequest.CONTROL_AF_TRIGGER,
                    CameraMetadata.CONTROL_AF_TRIGGER_START
                )
                //手机水平拍摄的时候  设置成VERTICAL
                if (sensorOrientation == ORIENTATION_VERTICAL) {
                    set(CaptureRequest.JPEG_ORIENTATION, 90)
                }

            }

这就是在拍照前,对相机的一些列设置  最后一个就是判断手机是水平时   将输出图片的orientation设置为90就可以了

我测试了手机自带的相机,水平拍摄时也是同样的处理方式

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值