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