您的位置:首页 > 其它

关于camera图像拉伸变形的问题

2014-10-23 14:53 155 查看

关于camera图像拉伸变形的问题

最近项目里要用到camera,少不了拍照功能,前期的做法是把surfaceview设置成屏幕大小,得到surfaceview的宽高比(就是屏幕的宽高比)

LayoutParams params = surfaceView.getLayoutParams();
Point p = DisplayUtil.getScreenMetrics(this);
Log.i(TAG, "screen: w = " + p.x + " y = " + p.y);
 params.width = p.x;
params.height = p.y;
surfaceView.setLayoutParams(params);
根据这个比例去找pitctureSize和previewSize的比例
Size pictureSize = CamParaUtil.getInstance(mCamera).getPropPictureSize(
					mParams.getSupportedPictureSizes(), 800);
			mParams.setPictureSize(pictureSize.width, pictureSize.height);

Size previewSize = CamParaUtil.getInstance(mCamera).getPropPreviewSize(
					mParams.getSupportedPreviewSizes(), mPreviwRate, 400);
			mParams.setPreviewSize(previewSize.width, previewSize.height);


public  Size getPropPreviewSize(List<Camera.Size> list, float th, int minHeight){
		Collections.sort(list, sizeComparator);

		int i = 0;
		for(Size s:list){
			if((s.height >= minHeight) && 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);
	}
	public Size getPropPictureSize(List<Camera.Size> list, float th, int minHeight){
		Collections.sort(list, sizeComparator);

		int i = 0;
		for(Size s:list){
			if((s.height >= minHeight) && 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);
	}

	public boolean equalRate(Size s, float rate){
		float r = (float)(s.width)/(float)(s.height);
		if(Math.abs(r - rate) <= 0.03)
		{
			return true;
		}
		else{
			return false;
		}
	}
以上的做法是参照yanzi大神做的,但是发现在一些比例不是主流(16:9/4:3)的手机上没用,图像还是拉伸的,所以就得换个思路了。

后来发现一篇文章点击打开链接,先得到pitctureSize,再根据pitctureSize的宽高比去确定surfaceView大小,以及previewSize的宽高比

根据这个思路,在以前的代码上做修改变成

public  Size getPropPreviewSize(List<Camera.Size> list, float th, int minHeight){
		Collections.sort(list, sizeComparator);
		int i =0;
		for(Size s:list){
			if((s.height >= minHeight) && equalRate(s, th)){
				Log.i(TAG, "PreviewSize:w = " + s.width + "h = " + s.height);
				break;
			}
			i++;
		}
		if(i == list.size()){
			i = 0;
		}
		return list.get(i);
	}
	public Size getPropPictureSize(List<Camera.Size> list, int minHeight){
		Collections.sort(list, sizeComparator);
		int i = 0;
		for(Size s:list)
		{
			if(s.height>minHeight)
			{
				Log.i(TAG, "PictureSize = " + s.width + "h = " + s.height);
				break;
			}
			i++;
		}
		return list.get(i);
	}
	public boolean equalRate(Size s, float rate){
		float r = (float)(s.width)/(float)(s.height);
		if(Math.abs(r - rate) <= 0.03)
		{
			return true;
		}
		else{
			return false;
		}
		
		
	}
目前基本上解决问题了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: