zxing 顶部状态栏与底部虚拟按键对取景范围的影响

1.zxing的ScreenResolution和CameraResolution:

         zxing的ScreenResolution(屏幕分辨率)是用来进行显示的。ScreenResolution通过CameraConfigurationManager.getScreenResolution()方法来获得。

        CameraResolution(相机分辨率)与显示无关,是用来进行识别的。通过CameraConfigurationManager.getCameraResolution()方法来获得。相机抓拍的图像,zxing进行识别时,其大小就是相机分辨率。

        由于手机屏幕上显示的元素可能不仅仅是相机当前的取景,还可能存在状态栏、虚拟按键等占用一定的像素,因此屏幕分辨率与相机分辨率的大小和宽高比例可能是不一致的,zxing的android包会对根据取景框的位置对识别区进行等比例伸缩,使得取景框中的图像和识别区的图像一致。如果不进行等比例伸缩,就有可能不一致。比方说,屏幕分辨率是1000*500,而相机分辨率是2000*500,我们设定取景框的上边缘在距离顶端200像素处,那么取景框距离上边缘是图像的1/5,而200像素直接用于定义识别区的话,识别区上边缘距离图像的上边缘就是整个图像高度的200/2000=1/10。也就时说,识别区要比取景框靠上。

        状态栏和虚拟按键都不会遮挡图像,也就是说,我们在屏幕中看到的图像和实际抓拍的图像是相同的。


2.没有状态栏,只有虚拟按键时:

        zxing会计算出屏幕分辨率,如果虚拟按键存在的话,屏幕分辨率不会包含虚拟按键所占用的像素。假设这里的屏幕分辨率是1812*1080(屏幕实际分辨率是1920*1080,底部虚拟按键高度108px),然后再计算出最合适的相机分辨率。这里zxing根据屏幕分辨率计算出的相机分辨率是1920*1080。

        如果此时我们把虚拟按键收起的话,取景框的位置也不会改变,因为取景框是画布的左边和上边为基准绘制的。屏幕上显示的图像也不会变,只是拉长了,这样就导致取景框对于图像来说,位置靠上了(取景框距离顶端位置不变,但是图像往下拉伸了),而识别区是按照比例识别的,因此不管图像怎么拉伸,识别区相对于图像的位置不变,因此取景框相比实际的识别区位置靠上了。

这种误差只有在打开扫码界面之后再收起或者打开虚拟键盘才会出现。如果不进行这样的操作的话,不会有误差,因为zxing得到的屏幕分辨率是去掉虚拟按键之后的屏幕分辨率。


3.有状态栏,没有虚拟按键时:

        zxing得到的屏幕分辨率不会去掉状态栏的高度,也就是说,显示或者隐藏状态栏,zxing得到的屏幕分辨率是同样的大小。但是有如果状态栏存在的话,显示的图像占用的像素高度会变小。假设这里zxing得到的屏幕分辨率是1812*1080,而状态栏高度是72,因此图像占用的分辨率实际上只有1740*1080,也就是说图像收缩了。而绘制取景框时,上边缘距离顶端的像素值不变,因此取景框比识别区位置靠下了。


综上所述,虚拟按键基本上对取景范围没影响;而状态则有较大影响,尤其是当ViewFinderView上面还有其他组件的时候。

解决办法:

1.隐藏状态栏或者设置为沉浸式状态栏。

2.在viewFinderView中修改:

在onDraw方法中这样添加以下代码:

Rect frame =cameraManager.getFramingRect();后添加:

Rect tempFrame = new Rect(frame);
        int ViewHeight = getHeight();
        tempFrame.top = frame.top*ViewHeight/cameraManager.getScreenResolution().y;
        tempFrame.bottom = frame.bottom*ViewHeight/cameraManager.getScreenResolution().y;
        frame = tempFrame;

也可以在cameraManger中修改,具体过程就不赘述了。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值