解决SurfaceView预览Camera拉伸问题
生活随笔
收集整理的這篇文章主要介紹了
解决SurfaceView预览Camera拉伸问题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在android中實現錄制視頻時,都會要求實現一個視頻預覽的功能(一般都是全屏預覽),實現方式就是用SurfaceView來實時顯示Camera傳遞過來的圖像。
但是我們都知道,android手機的屏幕尺寸千奇百怪,使用默認的預覽尺寸,部分手機會導致SurfaceView顯示時圖像拉長,整個人的臉看起來比驢臉還長;如果設置Camera的預覽尺寸為屏幕尺寸,那么如果剛好Camera不兼容這個尺寸,則會直接報錯。
那就沒辦法了么?
怎么能難倒萬能的android開發者,如果屏幕尺寸與預覽尺寸不一致,那么只要他們的寬高比一致,顯示出來的效果一樣是正常的。所以,重點是如何找到最相近的預覽尺寸參數,代碼如下:
/*** 通過對比得到與寬高比最接近的預覽尺寸(如果有相同尺寸,優先選擇)** @param isPortrait 是否豎屏* @param surfaceWidth 需要被進行對比的原寬* @param surfaceHeight 需要被進行對比的原高* @param preSizeList 需要對比的預覽尺寸列表* @return 得到與原寬高比例最接近的尺寸*/ public static Camera.Size getCloselyPreSize(boolean isPortrait, int surfaceWidth, int surfaceHeight, List<Camera.Size> preSizeList) {int reqTmpWidth;int reqTmpHeight;// 當屏幕為垂直的時候需要把寬高值進行調換,保證寬大于高if (isPortrait) {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; }然后在初始化Camera的時候設置預覽尺寸的參數: Camera.Parameters parameters = mCamera.getParameters(); Camera.Size preSize = CameraUtil.getCloselyPreSize(true, screenWidth, screenHeight, parameters.getSupportedPreviewSizes()); parameters.setPreviewSize(preSize.width, preSize.height); mCamera.setParameters(parameters);因為我這里SurfaceView是全屏顯示,所以,屏幕的寬高就是SurfaceView的寬高。
參考:
Android Camera多屏幕適配解決預覽照片拉伸
總結
以上是生活随笔為你收集整理的解决SurfaceView预览Camera拉伸问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 将字符串中每一个单词的首字母变为大写
- 下一篇: 压缩算法 【腾讯2020校园招聘-后台综