前几天遇到一个需求拍摄省份证需要加一个框,需要自定义一个浏览页面,我就自定义了一下相机发现拍摄预览的时候图像是变形的,我就各种查找解决方案,自定义相机步骤我就不说了,直接说说我怎么解决的:
首先要想不变形拉伸要保证三点一定要一样:
1.预览View的尺寸;
2.选取合适的预览分辨率;
List<Camera.Size> pictureSizeList = parameters.getSupportedPictureSizes();
3.选取相机支持的图片尺寸;
List<Camera.Size> previewSizeList = parameters.getSupportedPreviewSizes();
上面两个方法返回大致是如下:
后补。。。
其实理解这个后大家就可以自己想合适的解决方案,目前我有两种解决方案:
方法一 :这个方案简单粗暴,我们市面上所有手机基本都会支持两种分辨率4:3 / 16:9,我所浏览的区域选取4:3方法如下:
- 先设置好View宽高比是4:3
int windWidth = DensityUtils.getWindWidth(context);//我这里获取屏幕宽度
int mScreenWidth = windWidth;//预览View宽度
int mScreenHeight = windWidth / 3 * 4;//预览View高度
/**从列表中选取合适的分辨率*/
//拍摄尺寸
Camera.Size picSize = getProperSize(pictureSizeList, ((float) height / width));
if (null == picSize) {
picSize = parameters.getPictureSize();
}
parameters.setPictureSize(picSize.width, picSize.height);
//预览
Camera.Size preSize = getProperSize(previewSizeList, ((float) height) / width);
if (null != preSize) {
parameters.setPreviewSize(preSize.width, preSize.height);
}
/**
* 从列表中选取合适的分辨率
*/
private Camera.Size getProperSize(List<Camera.Size> pictureSizeList, float screenRatio) {
// Log.i(TAG, "screenRatio=" + screenRatio);
Collections.sort(pictureSizeList, new SizeL2hComparator());
Camera.Size result = null;
for (Camera.Size size : pictureSizeList) {
float currentRatio = ((float) size.width) / size.height;
if (currentRatio == screenRatio && size.width >= 640) {//此处加了一个图片分辨率限制根据情况而定
// LogsUtil.d("<-------->1>" + size.width + "<-------->" + size.height);
// ToastUtils.toastShort("<-------->1>" + size.width + "<-------->" + size.height);
result = size;
break;
}
}
//由于传入比例已经做过限制下面代码可有可无
if (null == result) {
for (Camera.Size size : pictureSizeList) {
float curRatio = ((float) size.width) / size.height;
if (curRatio == 4f / 3 && size.width >= 640) {
// LogsUtil.d("<-------->2>" + size.width + "<-------->" + size.height);
// ToastUtils.toastShort("<-------->2>" + size.width + "<-------->" + size.height);
result = size;
break;
}
}
}
return result;
}
/**
* 从小到大排序
*/
private static class SizeL2hComparator implements Comparator<Camera.Size> {
@Override
public int compare(Camera.Size size1, Camera.Size size2) {
if (size1.width > size2.width) {
return -1;
} else if (size1.width < size2.width) {
return 1;
}
return 0;
}
}
以上方法可以解决预览变形拉伸问题,但是有4:3比例局限性;
方法二 :目前提供一下思路后续具体提供内容;
此方法就是算出需求比例最相近的尺寸使用,然后设置预览View宽高,如有其他好的方案希望可以共同学习一下;