预览会出现拉伸的问题代码:
预览拉伸Demo


预览画面拉伸问题改正的 gitee 代码在文章最后给出
预览拉伸的原因:
每颗Camera都支持一些分辨率,Camera的这些图像如果和预览画面的宽高比例不一致就会发生预览图像拉伸。注意这里是宽高比,只要宽高比一致,即使宽高的大小不一样也不会拉伸。
另外:旋转手机时预览画面拉伸非常严重。
预览拉伸的解决办法:
将预览画面的宽高比设置为和 Camera 输出画面的宽高比一致

步骤
1.列出这颗 Camera 支持的所有 Size,以及手机的 width 和 height
2.遍历选择一个 Size,算出这个 Size 的宽高比 ratio = size.height / size.width(因为Camera Size的宽高是相反的)
3.以手机的宽作为预览控件的宽,如果得出的 ratio 使得控件的 height 超过手机的 height ,那么 遍历下一个Size 重复步骤2,直到选出一个合适的 Size。如果所有的 Size 的高都比手机的高都大,那么就需要使用 Matrix 手动将 Camera 输出的画面缩放到一个合适的大小,最后这种情况先不实现。
两点注意:
1.Camera 支持的所有 Size ,它的 size.width 和 size.height 是反着的,我们要把 size.width 当成高 ,size.height 当成宽。
2.预览控件在设置宽高比的时候,要保证预览画面的宽和手机的宽是一样的,这样看起来才不别扭。

预览控件的宽应该设置为 match_parent,高应该设置为 wrap_content
假设要设置的宽高比 ratio = cameraWidth / cameraHeight,
预览控件在设置宽高比的时候只改变高度即可: height = width / ratio

也许你会发现,这里我们并没有针对横屏的预览显示做处理,实际测试中发现,我们设置完宽高比,在旋转到横屏的时候也不会发生预览拉伸。


关键代码:

private Size getBestSize() {CameraManager cameraManager = (CameraManager) context.getSystemService(Context.CAMERA_SERVICE);CameraCharacteristics characteristics = null;try {characteristics = cameraManager.getCameraCharacteristics("0");} catch (CameraAccessException e) {e.printStackTrace();}// 获得手机的宽高Point point = new Point();((Activity) context).getWindowManager().getDefaultDisplay().getRealSize(point);int phone_width = point.x;int phone_height = point.y;Log.e(TAG, "phone_width = "+phone_width+", phone_height = "+phone_height );// 获取这颗Camera支持的SizeStreamConfigurationMap map = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);ArrayList<Size> sizeList = new ArrayList<Size>(Arrays.asList(map.getOutputSizes(SurfaceTexture.class)));for (Size size : sizeList) {Log.e(TAG, "width = "+size.getWidth() +", height = "+size.getHeight());double ratio = (double) size.getHeight() / (double)size.getWidth();// 以手机的宽作为控件的宽,计算出控件的高int height = (int) (phone_width / ratio);Log.e(TAG, "ratio = " + ratio + ", height = " + height);// 如果计算出的控件的高超过手机的高,就遍历下一个if (height > phone_height) {continue;}else {return size;}
}
// 没有合适的宽高比
return null;
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.TextureView;public class AutoFitTextureView extends TextureView {private static final String TAG = "hugang";private int ratioW = 0;private int ratioH = 0;public AutoFitTextureView(Context context) {super(context);}public AutoFitTextureView(Context context, AttributeSet attrs) {super(context, attrs);}public AutoFitTextureView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);}/*** 设置宽高比* @param width* @param height*/public void setAspectRation(int width, int height){if (width < 0 || height < 0) {throw new IllegalArgumentException("width or height can not be negative.");}ratioW = width;ratioH = height;Log.e(TAG, "setAspectRation: ratioW = "+ratioW+" ratioH = "+ratioH );//请求重新布局requestLayout();}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);int width = MeasureSpec.getSize(widthMeasureSpec);int height = MeasureSpec.getSize(heightMeasureSpec);Log.e(TAG, "onMeasure: width = "+width+" height = "+height );if (0 == ratioW || 0 == ratioH){//未设定宽高比,使用预览窗口默认宽高,当AutoFitTextureView初始化的时候会走一次这个逻辑setMeasuredDimension(width, height);Log.e(TAG, "onMeasure 000: width = "+width+" height = "+height );} else {//设定宽高比,调整预览窗口大小(调整后窗口大小不超过默认值)if (width < height * ratioW / ratioH) {Log.e(TAG, "onMeasure 111: width = "+width+" height = "+(width * ratioH / ratioW) );setMeasuredDimension(width, width * ratioH / ratioW);} else {Log.e(TAG, "onMeasure 222: width = "+(height * ratioW / ratioH)+" height = "+height );setMeasuredDimension(height * ratioW / ratioH, height);}}}
}

解决预览画面拉伸的Demo
预览画面拉伸问题改正Demo

Android Camera 预览拉伸问题相关推荐

  1. Android Camera 预览拉伸

    现象: 可以看到,相机预览拉伸严重,水杯都被拉伸很细长. 原因: 因为预览的控件(SurfaceView) 和相机输出的图像,宽高比不一致导致.我们需要统一控件的宽高比和相机输出的宽高比. 解决方法: ...

  2. Android camera预览流程

    前面已经简单介绍了,在Android系统中open camera的流程,但是,它又是怎么预览.怎么配置流,如何最终操作到camera HAL的呢.接下来以android原生相机应用,android9, ...

  3. MT6575 平板模式 camera 预览拉伸的问题

    MT6575 平台 android 4.0版本 改成1024x600的平板模式 进camera预览图像横向拉伸 解决方案: 1. 若 camera旋转了90°,修改 mediatek/custom/x ...

  4. Android Camera预览角度和拍照保存图片角度学习

    1 Camera预览角度处理 开发Camera过程中会遇到Camera拍照,获取照片后可以上传照片或者展示给用户. Camera的图像数据来源于摄像头硬件的图像传感器,这个图像传感器被固定到手机上后会 ...

  5. Android Camera 预览、拍照、保存照片 实现

    和你一起终身学习,这里是程序员Android 经典好文推荐,通过阅读本文,您将收获以下知识点: 一.Camera2架构概述 二.Camera2中比较重要的类及方法 三.具体实现步骤 四.初始化相关参数 ...

  6. android camera预览帧,android camera2处理每一帧并显示其预览

    我使用 https://github.com/googlesamples/android-Camera2Basic,但尝试修改它,我可以访问每个帧,然后在surfaceview上绘制. 我明白了,我应 ...

  7. android camera 预览 数据流,camera,SurfaceView实时预览获取帧数据,在手机上总是闪退...

    请教各位关于用camera类做一个关于预览SurfaceView,然后通过 public void onPreviewFrame(byte[] data, Camera camera)获取data转换 ...

  8. android camera 预览 数据流,Android Camera预览过程数据流浅析

    硬件平台:Atmel SAMA5D3 SoC + OV2640 Camera Sensor Android版本:4.2.2 mediaserver进程是Camera Service的容器进程,它会动态 ...

  9. Android相机预览页面被压缩和拉伸问题

    最近公司要求在原有的项目中添加一个扫码登录的功能,在调试好相机之后,发现相机返回到Surfaceview页面上的预览图片,与我们现实中物品的比例并不相同,在一块正方形的Surfaceview中,预览界 ...

最新文章

  1. 图标尺寸规范_作为刚入门的UI设计师,你需要懂哪些设计规范?
  2. Github上的10个数据科学和机器学习知识库
  3. 位运算与组合搜索(二)
  4. SAP S/4 Hana On-premise Edition 1511做了哪些简化
  5. mysql数值比中文检索快_MySQL 千万 级数据量根据(索引)优化 查询 速度
  6. Loopback for Mac虚拟音频传输管理工具
  7. spring jdbcTemplate查询使用
  8. java基于springboot校园餐厅订餐管理系统附源码
  9. Java中Math类常用方法
  10. 博通无线网卡驱动 linux,archlinux bcm4360 无线网卡驱动
  11. php获取qq头像地址,使用PHP语言通过邮箱获取全球公认的Gravatar头像地址
  12. 将老电脑从windows xp系统升级到10//将win10 32位系统更为64位
  13. 用Java实现 通过两个栈实现一个队列
  14. SQL 2008升级SQL 2008 R2完全教程或者10 00 1600升级10 50 1600
  15. ubuntu 的挂起与休眠
  16. 高端大气上档次!10个精美的国外HTML5网站欣赏
  17. 使用docker下载搭建TeamCity容器并使用
  18. 7-22 龟兔赛跑 (超简单详细思路)
  19. 【问链-区块链基础知识系列】 第十课 首席架构师谈区块链技术演进
  20. python基础知识之整除、取余、幂运算

热门文章

  1. java实现身份证有效性验证
  2. Chukeh 小诸葛 .Net 通用类库
  3. 秀米编辑后复制粘贴格式发生变形的解决方法
  4. 2022-04-13 工作记录--LayUI-动态渲染数据表格的表头参数
  5. [思维模式-9]:《如何系统思考》-5- 认识篇 - 改变开环、组合逻辑的线性思考,实施闭环、时序逻辑的动态思考。
  6. AI 靠眨眼反制假视频;马斯克等联名承诺不发展AI武器系统 | 一周 AI 新闻
  7. win10上安装两个ubuntu16.04系统分别安装在SSD和HHD
  8. 共模电流抑制思路小结
  9. 制造业从中国回流英国 英媒:工业史上的奇妙反转
  10. 【Node.js】之项目准备和首页