Android捕捉图像后在SurfaceView上变形显示问题的处理
2016-06-25 18:20
417 查看
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上变形显示的问题基本上就解决了!
相关文章推荐
- android中handler和looper的工作原理
- php做接口+android 请求API接口并展示到ListView例子
- Android ProgressBar详解以及自定义
- InterlliJ /Android Studio “Cannot resolve symbol” 解决办法
- android actionbar 网页在线生成style(修改配置)
- Android中内容观察者的使用---- ContentObserver类详解
- Android获取进程的权限信息
- Activity中windowSoftInputMode属性
- AsyncTask
- android学习之代码混淆小结
- android 自定义控件(四)自定义进度条
- Android_ListView控件_使用注意事项
- Android连接蓝牙耳机播放音乐
- Android知识整理<一>Activity
- Android JNI 传递对象
- Android中的Shape使用总结
- android 自定义控件(三) 进度条切换
- android.database.sqlite.SQLiteException: table has no column XXX (code 1)问题解决方法
- android之imgView插件的使用
- 通过Android录音进行简单音频分析