1. 程式人生 > >淺析Android Camera開發中的三個尺寸和三種變形 貢獻一個自適配Picturesize和Previewsiz

淺析Android Camera開發中的三個尺寸和三種變形 貢獻一個自適配Picturesize和Previewsiz

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

               

經常聽人問Camera開發中,各種變形問題,今天有空就在此梳理總結下。

三個尺寸:

1、Surfaceview的尺寸

Surfaceview是用來預覽Camera的,當它全屏時就是Screen的大小。

2、Picturesize的尺寸

這是拍照後的PictureSize尺寸。

3、Previewsize的尺寸

這是預覽時幀資料的尺寸。


三種變形:

1、預覽畫面的物體長寬失真。原因是Surfaceview和Previewsize的長寬比率不一致,就會導致預覽畫面上失真。因為camera在顯示時會將預覽幀資料縮放成Surfaceview大小,當比率不一致必然會物體變形。至於這個縮放演算法可能不同手機會有區別。

2、拍照後照片上物體變形。

3、點選拍照瞬間,預覽畫面上會突然變形然後恢復到正常預覽。 

 2、3兩種變形都是因為Previewsize和Picturesize的長寬比率不一致所致。總之一句話,為了保證圖片不是真,要保證預覽Surfaceview、Previewsize、Picturesize的長寬比率要一直。如果Surfaceview是全屏的話,要獲取螢幕長和寬得到比率。

 為此我寫了一個工具類,獲得合適的Picturesize和Previewsize,名字為:MyCamPara.java。

package org.yanzi.util;import java.util.Collections;import java.util.Comparator;import java.util.List;import android.hardware.Camera;import android.hardware.Camera.Size;import android.util.Log;public class MyCamPara private
static final String tag = "yan"private CameraSizeComparator sizeComparator = new CameraSizeComparator(); private static MyCamPara myCamPara = nullprivate MyCamPara(){   } public static MyCamPara getInstance(){  if(myCamPara == null){   myCamPara = new MyCamPara();   return myCamPara;  }  else{   return myCamPara;  } }  public  Size getPreviewSize(List<Camera.Size> list, int th){  Collections.sort(list, sizeComparator);    int i = 0;  for(Size s:list){   if((s.width > th) && equalRate(s, 1.33f)){    Log.i(tag, "最終設定預覽尺寸:w = " + s.width + "h = " + s.height);                break;   }   i++;  }  return list.get(i); } public Size getPictureSize(List<Camera.Size> list, int th){  Collections.sort(list, sizeComparator);    int i = 0;  for(Size s:list){   if((s.width > th) && equalRate(s, 1.33f)){    Log.i(tag, "最終設定圖片尺寸:w = " + 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.2)  {   return true;  }  else{   return false;  } }  public  class CameraSizeComparator implements Comparator<Camera.Size>{  //按升序排列  public int compare(Size lhs, Size rhs) {   // TODO Auto-generated method stub   if(lhs.width == rhs.width){   return 0;   }   else if(lhs.width > rhs.width){    return 1;   }   else{    return -1;   }  }   }}

對上面這個工具類註釋如下:

1,是個單例模式類。呼叫示例:

Size pictureS = MyCamPara.getInstance().getPictureSize(pictureSizes, 800);   myParam.setPictureSize(pictureS.width, pictureS.height);

2,程式首先對預覽尺寸的list進行升序排序,因為實際中發現,有的手機提供的是升序有的是降序。

3,通過equalRate(Size s, float rate)保證Size的長寬比率。一般而言這個比率為1.333/1.7777即通常說的4:3和16:9比率。

4、在getPreviewSize()函式裡增加判斷if((s.width > th) && equalRate(s, 1.33f)),除保證比率外,還保證使用者需要設定的尺寸寬度最小值。這個大家根據需要隨便改。

如果您覺得筆者在認真的寫部落格,請為我投上一票,謝謝大家。

CSDN2013部落格之星評選:

http://vote.blog.csdn.net/blogstaritem/blogstar2013/yanzi1225627


           

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述