我們在Android中經(jīng)常會(huì)使用SurfaceView編寫自定義的攝像頭,可是有的時(shí)候會(huì)經(jīng)常會(huì)出現(xiàn)圖像的變形麦乞,我們就會(huì)很郁悶的問這到底是為什么呢?其實(shí)這個(gè)最根本的原因是SurfaceView和PreViewSize的尺寸不是同一個(gè)比率。
所謂PreViewSize就是在預(yù)覽的時(shí)候幀數(shù)據(jù)的尺寸吨悍,SurfaceView是用來預(yù)覽Camera的視圖定拟,它的尺寸也就是Screen全屏?xí)r候的大小于微。還有一個(gè)重要尺寸的是PictureSize,這個(gè)是拍照后圖片的尺寸青自,就是所保存的結(jié)果圖片的大小株依。
所以解決剛剛問題就是調(diào)用Camera的takePicture方法之前設(shè)置一下Camera的PictureSize和PreviewSize兩個(gè)參數(shù),分別調(diào)用的方法是setPictureSize和setPreviewSize延窜。
然后實(shí)際的PictureSize和PreviewSize可通過如下步驟得到的:
首先是得到該手機(jī)可以適配的一系列尺寸
List<Size> previewSizes = params.getSupportedPreviewSizes();
List<Size> pictureSizes = params.getSupportedPictureSizes();
然后得到自己的屏幕的尺寸
public static float getScreenRate(Context context){
Point P = getScreenMetrics(context);
float H = P.y;
float W = P.x;
return (W/H);
}
最后根據(jù)自己的尺寸大小恋腕,從適配的尺寸當(dāng)中取一些屬于自己規(guī)格的尺寸
public Size getPropPreviewSize(List<Camera.Size> list, float th, int minWidth){
Collections.sort(list, sizeComparator);
int i = 0;
for(Size s:list){
if((s.width >= minWidth) && 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);
}
得到PreViewSize后逆瑞,同理得到PictureSize
mParams = mCamera.getParameters();
//設(shè)置PictureSize
Size pictureSize = getPropPictureSize(mParams.getSupportedPictureSizes(),previewRate, 1280);
mParams.setPictureSize(pictureSize.width, pictureSize.height);
//設(shè)置PreviewSize
Size previewSize = getPropPreviewSize(mParams.getSupportedPreviewSizes(), previewRate, 1280);
mParams.setPreviewSize(previewSize.width, previewSize.height);
這樣子關(guān)于在Android上調(diào)用Camera捕捉圖像后在SurfaceView上變形顯示的問題基本上就解決了吗坚!