ZXing扫码流程——相机角度和预览角度

一 Camera 内部类 CameraInfo

CameraInfo类用来描述相机信息,通过Camera类中getCameraInfo(int cameraId, CameraInfo cameraInfo)方法获得,主要包括以下两个成员变量:

facing
facing 代表相机的方向,它的值只能是
CAMERA_FACING_BACK(后置摄像头)
CAMERA_FACING_FRONT(前置摄像头)。

CAMERA_FACING_BACK 和 CAMERA_FACING_FRONT 是CameraInfo类中的静态变量

orientation
orientation是相机采集图片的角度。这个值是相机所采集的图片需要顺时针旋转至自然方向的角度值。它必须是0,90,180或270中的一个。
举个栗子:
假如你自然地竖着拿着手机(就是自拍时候的样子…),后置摄像头的传感器在手机里是水平方向的,你现在看着手机,如果传感器的顶部在自然方向上手机屏幕的右边(此时,手机是竖屏,传感器是横屏),那么这个orientation的值就是90。 如果前置摄像头的传感器顶部在手机屏幕右边,那么这个值就是270.

setDisplayOrientation()
设置预览画面顺时针旋转的角度。这个方法会影响预览图像和拍照后显示的照片。这个方法对竖屏应用非常有用。
注意,前置摄像头在进行角度旋转之前,图像会进行一个水平的镜像翻转。
所以用户在看预览图像的时候就像照镜子,看到的是现实的水平方向的镜像

注:setDisplayOrientation(int degrees)是Camea类中的一个方法,之所以穿插在这里来讲,是为了和上面提到的orientation做一个统一讲解,因为这两个都涉及到了方向问题

相信很多人都会搞混相机角度和预览角度;下面给小伙伴们详细介绍一下Android手机上几个方向的概念以及在使用Camera过程中会遇到的方向问题:

注:如果你是第一次使用Camera的话,首先要了解以下几点:

  • 相机图像数据都是来自于相机硬件的图像传感器(Image Sensor),这个Sensor被固定到手机之后是有一个默认的取景方向,且不会改变

  • 相机在预览的时候是有一个预览方向的,可以通过setDisplayOrientation()设置

  • 相机所采集的照片也是有一个方向的(就是上面刚刚提到的orientation),这个方向与预览时的方向互不相干(就是我们说的相机角度,模式是水平的,相当于我们的手机横屏)

屏幕坐标: 在Android系统中,屏幕的左上角是坐标系统的原点(0,0)坐标。原点向右延伸是X轴正方向,原点向下延伸是Y轴正方向

自然方向:每个设备都有一个自然方向,手机和平板的自然方向不同。手机的自然方向是portrait(竖屏),平板的自然方向是landscape(横屏)

图像传感器(Image Sensor)方向:手机相机的图像数据都是来自于摄像头硬件的图像传感器,这个传感器在被固定到手机上后有一个默认的取景方向,如下图所示
在这里插入图片描述

相机的预览方向:将图像传感器捕获的图像,显示在屏幕上的方向。在默认情况下,与图像传感器方向一致。在相机API中可以通过setDisplayOrientation()设置相机预览方向。在默认情况下,这个值为0,与图像传感器方向一致(预览其实就是我们看到的画面)
在这里插入图片描述

再来个箭头的图像帮助大家理解:
在这里插入图片描述

后置摄像头orientation=90,此时图像传感器采集图像的方向90度,相对于自然方向,如下:
在这里插入图片描述
此时图像采集的方向我们是无法改变的,但是能够改变预览的方向,通过setDisplayOrientation(90)顺时针旋转预览方向,以便在自然方向进行正确预览。

我们来看看前置摄像头orientation=270的情况,铭记前置摄像头预览方向在旋转之前会进行一个水平镜像翻转(可以理解为逆时针旋转180),这就是为什么我们通过手机前置摄像头预览时,看到的像是在照镜子一般。
在这里插入图片描述
此时我们需要将获取到的图片数据进行顺时针旋转270度,才能够在手机自然方向正确预览。接下来看看前者摄像头预览方向,注意咯
在这里插入图片描述

二 ZXing如何计算预览角度

因为摄像头传感器的角度是固定水平的,但是我们可以调整预览角度,达到与摄像头传感器互相适配的效果(就是自然方向看到的图像)
在这里插入图片描述
在这里插入图片描述

### 实现类似微信的二维描功能 为了实现在Android平台上创建类似于微信的二维描功能,可以采用多种方法技术栈。一种流行的方法是利用Google ZXing库来处理条形QR的实际解工作,并在此基础上构建更高级别的UI特性以模仿微信的设计。 #### 使用ZXing进行基础设置 首先,在`build.gradle`文件中添加依赖项以便能够使用ZXing库: ```gradle dependencies { implementation 'com.google.zxing:core:3.4.0' } ``` 接着,可以通过继承Activity并配置相机权限以及初始化CameraManager等操作完成初步环境搭建[^1]。 #### 自定义界面设计 对于希望达到与微信类似的视觉效果的应用程序来说,仅仅依靠默认的ZXing UI可能无法满足需求。因此,有必要自行设计布局文件,包括但不限于调整描框的位置、大小及其动画效果。具体而言,可以在XML资源文件里定义一个带有遮罩层(mask layer)的FrameLayout容器用于放置预览视图其他控件;同时编写Java/Kotlin代控制这些元素的行为逻辑,比如动态改变激光线的颜色或速度等参数[^3]。 #### 集成第三方组件优化体验 除了上述提到的手动定制方式外,还有专门针对此目的而打造好的开源解决方案可供选用——例如由GitHub用户zhyqieqie维护的WechatScan插件就提供了非常接近官方应用的操作感受,并且易于集成至现有工程当中。按照其文档指示执行相应步骤即可迅速启用该模块所提供的全部能力[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值