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

关于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;
		}
		
		
	}
目前基本上解决问题了。



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值