Android解决相机预览拉伸问题

拉伸的原因

1.主要是由于surfaceview的尺寸和 相机预览尺寸不一致造成的

    @Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {Log.e("相机--》surfaceview", "width--" + width);Log.e("相机--》surfaceview", "height--" + height);Log.e("相机--》mCamera", "width--" + mCamera.getParameters().getPreviewSize().width);Log.e("相机--》mCamera", "height--" +  mCamera.getParameters().getPreviewSize().height);}

log为
相机–》surfaceview: width–720
相机–》surfaceview: height–360
相机–》mCamera: width–1920
相机–》mCamera: height–1080
可以看到 surfaceview宽高比为2/1 但是相机预览尺寸比为16/9,所以造成了拉伸
2.解决办法获取相机预览的支持尺寸,动态设置最接近的尺寸

    @Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {Camera.Size closelyPreSize = getCloselyPreSize(width, height, mCamera.getParameters().getSupportedPreviewSizes());Camera.Parameters parameters = mCamera.getParameters();parameters.setPreviewSize(closelyPreSize.width,closelyPreSize.height);mCamera.setParameters(parameters);Log.e("相机--》surfcaeview", "width--" + width);Log.e("相机--》surfcaeview", "height--" + height);Log.e("相机--》closelyPreSize", "width--" + closelyPreSize.width);Log.e("相机--》closelyPreSize", "height--" + closelyPreSize.height);Log.e("相机--》mCamera", "width--" + mCamera.getParameters().getPreviewSize().width);Log.e("相机--》mCamera", "height--" +  mCamera.getParameters().getPreviewSize().height);}

log为
相机–》surfcaeview: width–720
相机–》surfcaeview: height–360
相机–》closelyPreSize: width–1920
相机–》closelyPreSize: height–960
相机–》mCamera: width–1920
相机–》mCamera: height–960
可以看到此时相机和surfaceview的比例都为2/1,预览就没有了拉伸

3最后附上获取接近比例的方法,

protected Camera.Size getCloselyPreSize(int surfaceWidth, int surfaceHeight,List<Camera.Size> preSizeList) {int ReqTmpWidth;int ReqTmpHeight;// 当屏幕为垂直的时候需要把宽高值进行调换,保证宽大于高if (false) {ReqTmpWidth = surfaceHeight;ReqTmpHeight = surfaceWidth;} else {ReqTmpWidth = surfaceWidth;ReqTmpHeight = surfaceHeight;}//先查找preview中是否存在与surfaceview相同宽高的尺寸for (Camera.Size size : preSizeList) {if ((size.width == ReqTmpWidth) && (size.height == ReqTmpHeight)) {return size;}}// 得到与传入的宽高比最接近的sizefloat reqRatio = ((float) ReqTmpWidth) / ReqTmpHeight;float curRatio, deltaRatio;float deltaRatioMin = Float.MAX_VALUE;Camera.Size retSize = null;for (Camera.Size size : preSizeList) {curRatio = ((float) size.width) / size.height;deltaRatio = Math.abs(reqRatio - curRatio);if (deltaRatio < deltaRatioMin) {deltaRatioMin = deltaRatio;retSize = size;}}return retSize;}

相机开发 学习
https://gitbook.cn/books/5aedb7582b543f6855b437af/index.html


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部