问题:
在Android 10中,旋转屏幕方向后,摄像头采集画面的方向,和我们预览的方向是不一致的,该怎么去解决?
当我们旋转屏幕默认为竖屏的时候,进行摄像头旋转采集的数据一般是横向的,而人预览的方向一般为竖向的。摄像头的采集方向是固定的,不管我们怎么旋转手机,它都沿固定方向进行采集
如果我们想要采集数据能够被正确预览,就需要根据采集方向和屏幕旋转角度,对预览画面进行旋转
这是我们屏幕初始的方向:默认横屏
当我们屏幕旋转270度,默认竖屏时,拍照方向
手机摄像头(Camera)的图像数据来源于摄像头硬件的图像传感器,这个图像传感器被固定到手机上后会有一个默认的取景方向,这个取景方向恰好是当手机左侧横放时的方向,其坐标原点于手机横放时的左上角。手机的正常方向和图像传感器默认取景方向示意图如下:
从上面的示意图可知,摄像头感器的取景方向与手机正常方向成90度夹角,此时我们要考虑将摄像头旋转90度,以实现正常的取景方向。按理来说,当我们旋转摄像头之后,以正常的手机方向来打开相机时,看到的预览图像是竖向的,实际图像也应该和预览一致。但是,当拍照后,当我们打开系统图库,看到的实际图像却是横向的,即预览图像与手机方向不一致。
这是因为系统自带的相机在Android系统底层根据当前手机屏幕的方向对图像传感器采集到的数据进行了旋转,所以无论我们怎么旋转手机屏幕,看到的相机预览图片始终是“不正常”的。而对于自定义的相机,如果没有对图像传感器的图片进行旋转处理,那么看到的实际图片就是横向的:
解决:
在android 10.1 的源码路径下,与关于Camera旋转摄像头方向的接口,进行修改后显示正常。
1.Camera旋转摄像头方向的源码路径:
android/hardware/interfaces/camera/device/3.4/default/ExternalCameraDeviceSession.cpp
android/hardware/interfaces/camera/device/3.4/default/ExternalCameraUtils.cpp
2.解决摄像头预览方向与实际图像方向不一致问题:
diff --git a/android/hardware/interfaces/camera/device/3.4/default/ExternalCameraDeviceSession.cpp b/android/hardware/interfaces/camera/device/3.4/default/ExternalCameraDeviceSession.cpp
index c2a49a3b5e..ea0a013c52 100755
--- a/android/hardware/interfaces/camera/device/3.4/default/ExternalCameraDeviceSession.cpp
+++ b/android/hardware/interfaces/camera/device/3.4/default/ExternalCameraDeviceSession.cpp
@@ -2889,7 +2889,7 @@ status_t ExternalCameraDeviceSession::initDefaultRequests() {
UPDATE(md, ANDROID_JPEG_QUALITY, &jpegQuality, 1);
UPDATE(md, ANDROID_JPEG_THUMBNAIL_QUALITY, &jpegQuality, 1);
- const int32_t jpegOrientation = 0;
+ const int32_t jpegOrientation = 90;
UPDATE(md, ANDROID_JPEG_ORIENTATION, &jpegOrientation, 1);
const uint8_t oisMode = ANDROID_LENS_OPTICAL_STABILIZATION_MODE_OFF;
diff --git a/android/hardware/interfaces/camera/device/3.4/default/ExternalCameraUtils.cpp b/android/hardware/interfaces/camera/device/3.4/default/ExternalCameraUtils.cpp
index e25deff797..f872f3dc75 100644
--- a/android/hardware/interfaces/camera/device/3.4/default/ExternalCameraUtils.cpp
+++ b/android/hardware/interfaces/camera/device/3.4/default/ExternalCameraUtils.cpp
@@ -162,7 +162,7 @@ namespace {
const int kDefaultJpegBufSize = 5 << 20; // 5MB
const int kDefaultNumVideoBuffer = 4;
const int kDefaultNumStillBuffer = 2;
- const int kDefaultOrientation = 0; // suitable for natural landscape displays like tablet/TV
+ const int kDefaultOrientation = 90; // suitable for natural landscape displays like tablet/TV
// For phone devices 270 is better
} // anonymous namespace
至此,摄像头显示正常,预览与实际图像一致。