zoukankan      html  css  js  c++  java
  • Android捕捉图像后在SurfaceView上变形显示问题的处理

    我们在Android中经常会使用SurfaceView编写自定义的摄像头,可是有的时候会经常会出现图像的变形,我们就会很郁闷的问这到底是为什么呢?其实这个最根本的原因是SurfaceView和PreViewSize的尺寸不是同一个比率。

    所谓PreViewSize就是在预览的时候帧数据的尺寸,SurfaceView是用来预览Camera的视图,它的尺寸也就是Screen全屏时候的大小。还有一个重要尺寸的是PictureSize,这个是拍照后图片的尺寸,就是所保存的结果图片的大小。

    所以解决刚刚问题就是调用Camera的takePicture方法之前设置一下Camera的PictureSize和PreviewSize两个参数,分别调用的方法是setPictureSize和setPreviewSize。

    然后实际的PictureSize和PreviewSize可通过如下步骤得到的:

    首先是得到该手机可以适配的一系列尺寸

    List<Size> previewSizes = params.getSupportedPreviewSizes();
    List<Size> pictureSizes = params.getSupportedPictureSizes();  

    然后得到自己的屏幕的尺寸

    public static float getScreenRate(Context context){  
         Point P = getScreenMetrics(context);  
         float H = P.y;  
         float W = P.x;  
         return (W/H);  
    } 


    最后根据自己的尺寸大小,从适配的尺寸当中取一些属于自己规格的尺寸

    public  Size getPropPreviewSize(List<Camera.Size> list, float th, int minWidth){  
        Collections.sort(list, sizeComparator);   
        int i = 0;  
        for(Size s:list){  
            if((s.width >= minWidth) && equalRate(s, th)){  
                Log.i(TAG, "PreviewSize:w = " + s.width + ",h = " + s.height);  
                break;  
            }  
            i++;  
        }  
        if(i == list.size()){  
            i = 0;//如果没找到,就选最小的size  
        }  
        return list.get(i);  
    }  


    得到PreViewSize后,同理得到PictureSize

    public Size getPropPictureSize(List<Camera.Size> list, float th, int minWidth){  
        Collections.sort(list, sizeComparator);  
        int i = 0;  
        for(Size s:list){ 
            if((s.width >= minWidth) && equalRate(s, th)){  
                Log.i(TAG, "PictureSize : w = " + s.width + ",h = " + s.height);  
                break;  
            }  
            i++;  
        }  
        if(i == list.size()){  
            i = 0;//如果没找到,就选最小的size  
        }  
        return list.get(i);  
    }  


    设置尺寸

    mParams = mCamera.getParameters();
    //设置PictureSize  
    Size pictureSize = getPropPictureSize(mParams.getSupportedPictureSizes(),previewRate, 1280); 
    mParams.setPictureSize(pictureSize.width, pictureSize.height); 
    //设置PreviewSize
    Size previewSize = getPropPreviewSize(mParams.getSupportedPreviewSizes(), previewRate, 1280);  
    mParams.setPreviewSize(previewSize.width, previewSize.height); 


    这样子关于在Android上调用Camera捕捉图像后在SurfaceView上变形显示的问题基本上就解决了!

  • 相关阅读:
    oracle内核参数详解
    oracle分区表原理学习
    expdp导出时报错ora-16000
    【CS224n-2019学习笔记】Lecture 1: Introduction and Word Vectors
    【SQL必知必会笔记(3)】SELECT语句的WHERE子句数据过滤操作
    【SQL必知必会笔记(2)】检索数据、排序检索数据
    【SQL必知必会笔记(1)】数据库基础、SQL、MySQL8.0.16下数据库、表的创建及数据插入
    win10,64位操作系统安装mysql-8.0.16经验总结(图文详细,保证一次安装成功)
    【机器学习实战笔记(3-3)】关于朴素贝叶斯实现代码中的一些错误总结
    【机器学习实战笔记(3-2)】朴素贝叶斯法及应用的python实现
  • 原文地址:https://www.cnblogs.com/chenjianxiang/p/4168203.html
Copyright © 2011-2022 走看看