自定义相机那些坑之预览界面适配及原理

0.思维导图

1.问题的产生

当Activity的oritation设置为portrait时,前置/后置摄像头预览图像会逆时针旋转90度展示,如图:

2.问题产生的本质

相机图像数据来自图像感应器(物理器件)(Image Sensor),图像感应器再将数据输出到预览Window上时,图像感应器有一个读取图像的方向,并且不会改变。这个读取的方向通过CameraInfo的orientation可以获取。现在的图像感应器硬件的读取方向都是顺时针90度,即读取方向如下图:

由此就会产生预览方向逆时针旋转90度。具体的产生过程如图:

3.官方推荐的解决方案

    public static void setCameraDisplayOrientation(Activity activity,
          int cameraId, android.hardware.Camera camera) {
      android.hardware.Camera.CameraInfo info =
              new android.hardware.Camera.CameraInfo();
      android.hardware.Camera.getCameraInfo(cameraId, info);
      int rotation = activity.getWindowManager().getDefaultDisplay()
              .getRotation();
      int degrees = 0;
      switch (rotation) {
         case Surface.ROTATION_0: degrees = 0; break;
          case Surface.ROTATION_90: degrees = 90; break;
          case Surface.ROTATION_180: degrees = 180; break;
          case Surface.ROTATION_270: degrees = 270; break;
      }

     int result;
      if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
          result = (info.orientation + degrees) % 360;
          result = (360 - result) % 360;  // compensate the mirror
     } else {  // back-facing
         result = (info.orientation - degrees + 360) % 360;
     }
      camera.setDisplayOrientation(result);
  }

推荐的解决方案中:
(1)CameraInfo是实例化的相机类,其中orientation是相机(图像感应器)相对于自然坐标系(即左上角坐标系)的旋转角度数.
(2)rotation是预览window的旋转的方向,当Activity的 screenOrientation="portrait"时,rotation=0,也就是没有旋转,当 screenOrientation="landscape"时,rotation=1。
(3)camera.setDisplayOrientation(int param)根据官方解释就是图片已经输出后旋转的度数。旋转值可以是 0, 90, 180, and 270. (a)当打开后置摄像头,Window竖屏显示时,预览图像旋转: result=(90-0+360)%360=90,顺时针旋转90度.
(b)当打开后置摄像头,Window横屏显示时,预览图像旋转: result=(90-90+360)%360=0,顺时针旋转0度.
(c)前置摄像头有一些特殊情况,在下面会谈到。
(d)param的参数官方解释 @param degrees the angle that the picture will be rotated clockwise.Valid values are 0, 90, 180, and 270.

4.一些存在的问题

1、对于前后摄像头,图像感应器输出的方向是一致的,并不像部分博客所说进行了镜像。
2、CameraInfo中的facing字段,无论是调用前置摄像头还是后置摄像头,facing均为0,即后置摄像头值。如下图各种机型返回值:

5.参考相关文档

腾讯Bugly: https://blog.csdn.net/Tencent_Bugly/article/details/53375311 http://hao.caibaojian.com/16047.html
Demo: https://github.com/xionglei12/camera-preview-demo.git

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
安卓 Camerax 是一个用于相机应用开发的官方库,它提供了简化相机功能的 API。要使用 Camerax 自定义相机适配高清,我们可以按照以下步骤进行: 1. 导入依赖:在项目的 `build.gradle` 文件中添加 Camerax 依赖项。 2. 检查权限:在 AndroidManifest.xml 文件中添加相机权限。 3. 配置相机用例:使用 Camerax 的 CameraSelector 创建相机用例,并设置预览分辨率,默认情况下,它会自动选择最佳分辨率。 4. 创建预览界面:在布局文件中添加一个预览视图,用于显示相机预览画面。 5. 实现相机功能:使用 Camerax 的 ImageCapture 和 ImageAnalysis 实现拍照和图像分析等功能。 6. 配置相机参数:通过设置不同的参数来适配高清。 7. 监听图片捕获事件:通过添加图像捕获监听器,可以在相机捕获照片后获取图像数据。 8. 处理图像数据:根据需求对捕获的图像数据进行处理,例如保存到本地或进行进一步的图像处理。 9. 销毁相机用例:在相机不再使用时,调用 CameraX.unbindAll() 方法来停止相机和释放资源。 总结而言,使用 Camerax 自定义相机适配高清的关键步骤包括导入依赖、配置相机用例、创建预览界面、实现相机功能、配置相机参数、监听图片捕获事件、处理图像数据和销毁相机用例。通过这些步骤,我们可以实现一个功能完整的自定义相机,并且可以适配高清图像的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值