设为首页 加入收藏

TOP

google zxing android扫描优化&解析(三)
2019-09-01 23:13:09 】 浏览:61
Tags:google zxing android 扫描 优化 解析
扫描到的图片,我们可以看到,图片是camera的原始成像,因此可以得知上述结论。由于旋转了图像,如果我们仍然以上述第3条中的方法去取数据的话,很有可能会越界,导致crash。如果我们预设的识别的窗口大小不是正方形,而是长方形的话,我们就可以看到,识别的窗口中显示是正常图像,可识别出来显示的图片却是垂直方向的,因此,我们在取图像时,应重新计算大小,及长宽。对原有代码做如下修改。
    public synchronized Rect getFramingRectInPreview() {
        if (framingRectInPreview == null) {
            Rect framingRect = ScanManager.getInstance().getViewfinderRect();
            Point cameraResolution = configManager.getCameraResolution();
            if (framingRect == null || cameraResolution == null || surfacePoint == null) {
                return null;
            }
            Rect rect = new Rect(framingRect);
            float scaleX = cameraResolution.x * 1.0f / surfacePoint.y;
            float scaleY = cameraResolution.y * 1.0f / surfacePoint.x;
            if (isPortrait) {
                rect.left = (int) (framingRect.top * scaleY);
                rect.right = (int) (framingRect.bottom * scaleY);
                rect.top = (int) (framingRect.left * scaleX);
                rect.bottom = (int) (framingRect.right * scaleX);
            } else {
                scaleX = cameraResolution.x * 1.0f / surfacePoint.x;
                scaleY = cameraResolution.y * 1.0f / surfacePoint.y;
                rect.left = (int) (framingRect.left * scaleX);
                rect.right = (int) (framingRect.right * scaleX);
                rect.top = (int) (framingRect.top * scaleY);
                rect.bottom = (int) (framingRect.bottom * scaleY);
            }
            framingRectInPreview = rect;
        }
        return framingRectInPreview;
    }

 

  •   对于成像有变形的问题,最简单的方法就是我们根据camera的大小去计算surfaceView的大小,先看修改后的代码
        public void initFromCameraParameters(Camera camera, Point maxPoint) {
            Camera.Parameters parameters = camera.getParameters();
            Point size = new Point(maxPoint.y, maxPoint.x);
            cameraResolution = CameraConfigurationUtils.findBestPreviewSizeva lue(parameters, size);
            Log.i(TAG, "Camera resolution: " + cameraResolution);
            Log.i(TAG, "size resolution: " + size);
        }
        public void findBestSurfacePoint(Point maxPoint) {
            Point cameraResolution = configManager.getCameraResolution();
            if (cameraResolution == null || maxPoint == null || maxPoint.x == 0 || maxPoint.y == 0)
                return;
            double scaleX, scaleY, scale;
            if (maxPoint.x < maxPoint.y) {
                scaleX = cameraResolution.x * 1.0f / maxPoint.y;
                scaleY = cameraResolution.y * 1.0f / maxPoint.x;
            } else {
                scaleX = cameraResolution.x * 1.0f / maxPoint.x;
                scaleY = cameraResolution.y * 1.0f / maxPoint.y;
            }
            scale = scaleX > scaleY ? scaleX : scaleY;
            if (maxPoint.x < maxPoint.y) {
                surfacePoint.x = (int) (cameraResolution.y / scale);
                surfacePoint.y = (int) (cameraResolution.x / scale);
            } else {
                surfacePoint.x = (int) (cameraResolution.x / scale);
                surfacePoint.y = (int) (cameraResolution.y / scale);
            }
        }

       在CameraConfigurationManager中camera初始化的时候,即initFromCameraParameters,我们会传进去一个surfaceView支持的最大宽高,通过CameraConfigurationUtils.findBestPreviewSizeva lue(parameters, size);我们能够得到camera在surfaceView中最好的成像大小,此时,我们就使用这个大小,但由于这个大小是上述列表列出的固定大小,而surfaceView的宽高变化较多,因此有可能会使成像变形,因此,我们要根据camera返回的最好成像的大小去计算适合的surfaceView的大小,即最合适的比例,通过findBestSurfacePoint方法,我们可以实现。计算出来以后,只要重新设置surfaceView的大小即可,此时看到的图像就不会再变形。

  •  

     

     

        更多解析,这里不再缀述,具体过程看实现代码,点击下载 。

        第一次写blog,很多不好的地方,不正确的地方,欢迎大家指正,点评。

     

    首页 上一页 1 2 3 下一页 尾页 3/3/3
    】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
    上一篇C#-Xamarin的Android项目开发(二).. 下一篇粮草先行——Android折叠屏开发技..

    最新文章

    热门文章

    Hot 文章

    Python

    C 语言

    C++基础

    大数据基础

    linux编程基础

    C/C++面试题目