Android Camera多屏幕适配解决预览照片拉伸

原创 2015年10月22日 20:12:49

通常,拍照预览页面的照片拉伸主要与下面两个因素有关:

1.     Surfaceview的大小

2.     Camera中的Preview的大小

如下图:

    图中preview显示的是手机支持的预览尺寸,picture显示的是手机支持设置图片尺寸,screen显示的是屏幕尺寸,surface显示的是surfaceview尺寸,default pre:手机缺省情况下的预览尺寸,default pic:手机缺省请款下的图片尺寸。reqPreview:手机设置的预览尺寸,reqPicSize:手机设置的图片尺寸。

 

如图,该手机surfaceview大小为1280*720(横屏,比例为:16:9)预览尺寸大小为960*720(横屏,比例为4:3)。从上面的二维码可以看到产生了明显的拉伸。正因为surfaceview的宽高比例跟camera preview的宽高比例不一样才会产生这样的效果。

如果surfaceview尺寸比例跟预览尺寸比例相同,那便不会产生变形,如下图:


设置surfaceview大小为 1280*720(横屏,比例为:4:3)预览尺寸大小为2048*1152(横屏,比例为4:3)便不会拉伸变形。

上面只是针对一种屏幕进行设置,而且每台手机所支持的预览尺寸是不一样的,所以这样子固定死的话很可能会产生程序崩溃,而崩溃的原因是因为该手机不支持你所支持的尺寸。

 

那么问题就来了,怎么样才能够达到适配多台手机,界面不产生拉伸变形,而且程序又不崩溃?

思路如下:

1.     先将获取手机支持预览的尺寸列表通过方法parmeters.getSupportedPreviewSizes()来得到返回类型为List<Size>的值,

2.     先进行屏幕方向的一个判断,因为预览列表里面的尺寸都是w>h(即横屏),如果屏幕是竖屏则需要先将宽高进行调换,这样方便接下来的比较。

3.     先用for循环将预览尺寸列表每个元素宽高与surfaceview的宽高进行比较,如果存在宽高尺寸都与surfaceview宽高尺寸相同的size则将该宽高设置为预览尺寸。

4.     如果步骤2找不到相同尺寸就得进行该步骤,将尺寸列表的宽高比例和surfaceview的比例作比较,找到一个相同或相近的。(一般来说,只要surfaceview的尺寸和屏幕尺寸相同,就可以找到相同的比例)然后将该尺寸的size设置为预览尺寸。

接下来是上代码

/**
	 * 通过对比得到与宽高比最接近的尺寸(如果有相同尺寸,优先选择)
	 * 
	 * @param surfaceWidth
	 *            需要被进行对比的原宽
	 * @param surfaceHeight
	 *            需要被进行对比的原高
	 * @param preSizeList
	 *            需要对比的预览尺寸列表
	 * @return 得到与原宽高比例最接近的尺寸
	 */
	protected Camera.Size getCloselyPreSize(int surfaceWidth, int surfaceHeight,
			List<Size> preSizeList) {
		
		int ReqTmpWidth;
		int ReqTmpHeight;
		// 当屏幕为垂直的时候需要把宽高值进行调换,保证宽大于高
		if (mIsPortrait) {
			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;
			}
		}
		
		// 得到与传入的宽高比最接近的size
		float 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;
	}


自定义相机预览图片拉伸的巧妙解决方法

在做自定义相机时,在网上找了一些demo,发现预览时候图片拉伸,网上很多解决办法是将相机设置为mCamera.setDisplayOrientation(-90);然而这个办法并没有用,我也没做深究,...
  • YvonneZhangYL
  • YvonneZhangYL
  • 2015年10月18日 22:33
  • 3736

Camera预览图像拉伸

修复Bug:现象:原生Camera调用,预览的图像出现拉伸.解决过程三大步骤: 首先根据机型获得一个最佳预览比例 根据第一步的最佳预览比例设置好预览View的宽高 Camera.Parameter的一...
  • sz66cm
  • sz66cm
  • 2016年06月23日 10:50
  • 914

Android Camera 预览图像被拉伸变形的解决方法

问题描述:预览图像被拉伸变形 问题原因:由于预览图像大小跟SurfaceView 大小不一致引起 解决方法: 获取系统支持的所有预览尺寸[getSupportedPictureSizes],然...
  • leeo1010
  • leeo1010
  • 2015年05月07日 20:21
  • 15429

android camera 摄像头预览画面变形

https://www.zybuluo.com/kmfish/note/269589 问题:最近在处理一下camera的问题,发现在竖屏时预览图像会变形,而横屏时正常。但有的手机则是横竖...
  • mengzhengjie
  • mengzhengjie
  • 2017年04月27日 16:12
  • 1433

浅析Android Camera开发中的三个尺寸和三种变形 (贡献一个自适配Picturesize和Previewsize的工具类)

本文浅析了Camera开发中经常出现的变形问题,剖析其原因。提供一个工具类自适配满足一定尺寸且保证长宽比率的PreviewSize和PictureSize。...
  • yanzi1225627
  • yanzi1225627
  • 2013年12月29日 14:02
  • 28394

Android Camera setRecordingHint(true)函数 在部分手机上的问题,例如拉伸,变形

setRecordingHint  此函数是提高MediaRecorder录制摄像头视频性能的。  技巧:如果你的应用是专为录像写的,那么在启动你的预览之前调用setRecordingHi...
  • isuker
  • isuker
  • 2016年05月13日 10:16
  • 2614

Android Camera开发分辨率 清晰度 图像变形

设置了previewSize和pictureSize: 但是通过打Log看出当时设置的时候分辨率是改变了的,然而正是拍照的时候分辨率又变回系统默认的了,在不同的机子上默认的分辨率不同。setPara...
  • a2241076850
  • a2241076850
  • 2017年03月22日 17:01
  • 2469

android开发摄像头开发,在自己的SurfaceView里预览,并且解决摄像头预览变形问题--懒人笔记02

本来想只贴设置预览尺寸的部分了,后来想想就直接写个最简单的完整的demo吧 先在mainfeast中加入权限 然后是anctivity_main文件中的代码 ...
  • qiguangyaolove
  • qiguangyaolove
  • 2016年11月03日 09:52
  • 5469

Android学习【1】解决android摄像头预览的变形问题

今天开始弄安卓摄像头开发,开始比较顺利,成功实现了摄像头预览拍照的问题,发现预览时SurfaceView 出现了变形的问题,拍照保存图像后也有相应的问题,于是各种网上查找以及分析api。 最终发现ap...
  • fxmfxm9304
  • fxmfxm9304
  • 2015年08月20日 20:29
  • 1236

安卓开发之自定义相机时图片变形问题

安卓开发之自定义相机时图片变形问题
  • cmwly
  • cmwly
  • 2017年06月21日 16:08
  • 734
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android Camera多屏幕适配解决预览照片拉伸
举报原因:
原因补充:

(最多只允许输入30个字)