淺析Android Camera開發中的三個尺寸和三種變形 (貢獻一個自適配Picturesize和Previewsize的工具類)


轉至 (http://blog.csdn.net/yanzi1225627/article/details/17652643)

經常聽人問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。

 

[java]  view plain copy print ? 在CODE上查看代碼片 派生到我的代碼片
 
  1. package org.yanzi.util;  
  2.   
  3. import java.util.Collections;  
  4. import java.util.Comparator;  
  5. import java.util.List;  
  6.   
  7. import android.hardware.Camera;  
  8. import android.hardware.Camera.Size;  
  9. import android.util.Log;  
  10.   
  11. public class MyCamPara {  
  12.     private static final String tag = "yan";  
  13.     private CameraSizeComparator sizeComparator = new CameraSizeComparator();  
  14.     private static MyCamPara myCamPara = null;  
  15.     private MyCamPara(){  
  16.           
  17.     }  
  18.     public static MyCamPara getInstance(){  
  19.         if(myCamPara == null){  
  20.             myCamPara = new MyCamPara();  
  21.             return myCamPara;  
  22.         }  
  23.         else{  
  24.             return myCamPara;  
  25.         }  
  26.     }  
  27.       
  28.     public  Size getPreviewSize(List<Camera.Size> list, int th){  
  29.         Collections.sort(list, sizeComparator);  
  30.           
  31.         int i = 0;  
  32.         for(Size s:list){  
  33.             if((s.width > th) && equalRate(s, 1.33f)){  
  34.                 Log.i(tag, "最終設置預覽尺寸:w = " + s.width + "h = " + s.height);  
  35.                 break;  
  36.             }  
  37.             i++;  
  38.         }  
  39.   
  40.         return list.get(i);  
  41.     }  
  42.     public Size getPictureSize(List<Camera.Size> list, int th){  
  43.         Collections.sort(list, sizeComparator);  
  44.           
  45.         int i = 0;  
  46.         for(Size s:list){  
  47.             if((s.width > th) && equalRate(s, 1.33f)){  
  48.                 Log.i(tag, "最終設置圖片尺寸:w = " + s.width + "h = " + s.height);  
  49.                 break;  
  50.             }  
  51.             i++;  
  52.         }  
  53.   
  54.         return list.get(i);  
  55.     }  
  56.       
  57.     public boolean equalRate(Size s, float rate){  
  58.         float r = (float)(s.width)/(float)(s.height);  
  59.         if(Math.abs(r - rate) <= 0.2)  
  60.         {  
  61.             return true;  
  62.         }  
  63.         else{  
  64.             return false;  
  65.         }  
  66.     }  
  67.       
  68.     public  class CameraSizeComparator implements Comparator<Camera.Size>{  
  69.         //按升序排列  
  70.         public int compare(Size lhs, Size rhs) {  
  71.             // TODO Auto-generated method stub  
  72.             if(lhs.width == rhs.width){  
  73.             return 0;  
  74.             }  
  75.             else if(lhs.width > rhs.width){  
  76.                 return 1;  
  77.             }  
  78.             else{  
  79.                 return -1;  
  80.             }  
  81.         }  
  82.           
  83.     }  
  84. }  


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

 

1,是個單例模式類。調用示例:

 

[java]  view plain copy print ? 在CODE上查看代碼片 派生到我的代碼片
 
  1. Size pictureS = MyCamPara.getInstance().getPictureSize(pictureSizes, 800);  
  2.             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)),除保證比率外,還保證用戶需要設置的尺寸寬度最小值。這個大家根據需要隨便改。

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM