前幾天遇到一個需求拍攝省份證需要加一個框,需要自定義一個瀏覽頁面,我就自定義了一下相機(jī)發(fā)現(xiàn)拍攝預(yù)覽的時候圖像是變形的,我就各種查找解決方案,自定義相機(jī)步驟我就不說了,直接說說我怎么解決的:
首先要想不變形拉伸要保證三點一定要一樣:
1.預(yù)覽View的尺寸;
2.選取合適的預(yù)覽分辨率;
List<Camera.Size> pictureSizeList = parameters.getSupportedPictureSizes();
3.選取相機(jī)支持的圖片尺寸;
List<Camera.Size> previewSizeList = parameters.getSupportedPreviewSizes();
上面兩個方法返回大致是如下:
后補(bǔ)。。。
其實理解這個后大家就可以自己想合適的解決方案,目前我有兩種解決方案:
方法一 :這個方案簡單粗暴,我們市面上所有手機(jī)基本都會支持兩種分辨率4:3 / 16:9,我所瀏覽的區(qū)域選取4:3方法如下:
- 先設(shè)置好View寬高比是4:3
int windWidth = DensityUtils.getWindWidth(context);//我這里獲取屏幕寬度
int mScreenWidth = windWidth;//預(yù)覽View寬度
int mScreenHeight = windWidth / 3 * 4;//預(yù)覽View高度
/**從列表中選取合適的分辨率*/
//拍攝尺寸
Camera.Size picSize = getProperSize(pictureSizeList, ((float) height / width));
if (null == picSize) {
picSize = parameters.getPictureSize();
}
parameters.setPictureSize(picSize.width, picSize.height);
//預(yù)覽
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) {//此處加了一個圖片分辨率限制根據(jù)情況而定
// LogsUtil.d("<-------->1>" + size.width + "<-------->" + size.height);
// ToastUtils.toastShort("<-------->1>" + size.width + "<-------->" + size.height);
result = size;
break;
}
}
//由于傳入比例已經(jīng)做過限制下面代碼可有可無
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;
}
}
以上方法可以解決預(yù)覽變形拉伸問題,但是有4:3比例局限性;
方法二 :目前提供一下思路后續(xù)具體提供內(nèi)容;
此方法就是算出需求比例最相近的尺寸使用,然后設(shè)置預(yù)覽View寬高,如有其他好的方案希望可以共同學(xué)習(xí)一下;