騰訊優測 總監 雷彬
【引言】
若是你不想隨時扛着單反和三腳架去抓拍生活的點滴故事,卻仍然但願能拍到質量很高效果很好的照片。若是你不想由於拍照的失誤而錯太重要的瞬間。若是你手上有一部安卓手機,而且安裝了一款很是不錯的相機app,你的願望就能實現。
用手機記錄生活和身邊的風景,已經漸漸成爲了一種生活方式。隨着手機用戶對拍照質量的要求日益提升,各個手機廠商在相機系統上更是大作文章,競爭激烈。所以相機系統的各類機型適配問題,能夠說是奇葩不斷,匪夷所思,攻城獅們都驚呆了!
本文就討論一下如何提高android相機產品質量,爲用戶拍出高質量的照片。
【Camera系統原理及Android相機成像】
1.Android camera系統介紹
對於作相機產品的攻城獅來講,距離咱們最近的相機相關的部分就是Android Camera系統了。咱們就先介紹一下咱們又愛又恨的Android Camera系統。
(1)Camera系統結構
Andriod 照相機的基本層次結構
Andriod Camera 系統結構java
自下而上,Camera系統分紅了如下幾個部分:
(1)攝像頭驅動程序
(2)Camera硬件抽象層
(3)Camera服務部分
(4)Camera的本地框架代碼
(5)Camera的JNI代碼
(6)Camera系統的java類
(2)Camera系統調用流程
Camera系統的幾個經常使用功能:
(1)預覽preview
(2)視頻獲取recording
(3)拍照takePicture
(4)參數設置
而圖像處理的重點在於預覽,拍照和參數設置,下圖是調用流程。
(3)Camera系統數據流
當圖像數據出現問題的時候,咱們須要知道數據流的前因後果,找到關鍵模塊,查出問題的根源。android
圖片預覽的數據流
拍照的數據流
2.Android相機成像原理:
接下來咱們討論一下硬件的成像原理,這一部分是決定拍照質量的基礎。
景物經過鏡頭生成的光學圖像投射到圖像傳感器表面上,而後轉爲電信號,通過ADC(模數轉換)轉換後變爲數字圖像信號,再送到數字信號處理芯片(DSP)中加工處理,再經過IO接口傳輸到CPU中處理,經過DISPLAY就能夠看到圖像了。
在這部分,咱們經常使用的可以提升照片質量的功能包括:對焦,曝光,感光,測光,白平衡,對比度,實時濾鏡,全景照片,方向矯正等。要想解決好機型適配問題,提升產品質量,從而提升照片質量,須要在以上幾個方面要作好功課。
【相機系統的適配問題】
經過對相機適配問題的蒐集和整理總結,咱們發現出現問題的緣由大體是來源於如下幾個方面。
1.camera系統
在android中Google實現了與硬件無關的全部代碼,可是與硬件密切相關的硬件抽象層卻沒有也沒法提供,對於不一樣設備底層硬件是變幻無窮的,不可能提供統一的硬件驅動以及接口實現,只能提供標準的接口,所以硬件提供商須要本身開發設備驅動,並去實現android框架提供的接口。這樣就致使一樣的相機產品,在不一樣機型上拍照效果卻不同。甚至某些特殊功能,硬件不支持。好比有些低端機型的攝像頭不支持自動對焦,不支持測光。從而這些硬件不支持的API沒法調用,或者返回值特殊。頭疼的是幾乎全部廠商都會根據本身的須要改變camera系統。
2.andriod版本
Andriod不一樣版本的camera類的API會有改變,同時開源庫也會不一樣。 最新的andriod4.3版本已經標配opengles3.0。和過去使用了好久的opengles2.0相比,3.0增長了更多的高端大氣上檔次的紋理。於是對機器的性能要求也更高。
3.機型的硬件配置
不一樣價位,不一樣廠商的機型,硬件配置截然不同。這裏說的硬件配置不是指攝像頭,而是指處理圖像要用到的CPU,GPU,傳感器等等。好比性能很差的GPU或者沒有GPU的機型處理數據時,速度達不到默認的幀率要求時,就會出現跳幀,數據覆蓋等狀況。全景拍照和人臉識別都會出現相似的問題。而傳感器則涉及到照片方向矯正問題。
【解決適配問題,提升照片質量】
如下是用戶在拍照時的操做過程已經容易出現的問題。
要提升照片質量,咱們能夠從實際的拍照過程當中對焦,曝光,感光,測光,白平衡,場景模式,方向矯正等角度入手。解決相關的適配問題,提升產品質量。
大連騰訊優測項目組對相機系統相關的機型適配bug進行了蒐集和整理。接下來舉幾個例子說明。
1.手機無閃光燈,可是調用API查詢閃光燈狀態時仍然返回有閃光燈的狀態。
奇葩到處有,相機特別多。三星 i5508和天語T619使用Android官方API getSupportedFlashModes( )判斷是否有閃光燈時返回結果不許確。
解決策略:
PackageManager pm=(PackageManager)getSystemService(Context.PackageManager);
FeatureInfo[] features=pm.getSystemAvailableFeatures();
for(FeatureInfo f : features)
{
logcat.d( f.name);
if(PackageManager.FEATURE_CAMERA_FLASH.equasl( f.name))
{
//代碼
}
}
2.HTC部分機型拍照方向默認爲橫屏,豎屏拍照時,照片方向錯誤。
這個奇葩問題在多個機型中都會出現。具備必定的廣泛性。
解決策略:
(1)對於可以從圖像數據中找到旋轉角度的機型。利用ExifInterface取到圖片數據中的拍攝方向,返回的值爲1,3,6,8 。1爲與默認拍攝方向相符不須要旋轉,3爲再默認拍攝方向向右旋轉90度,6爲再默認拍攝方向向左旋轉90度,8爲再默認拍攝方向旋轉180度,代碼以下:
ExifInterface ef = new ExifInterface(圖片存儲位置);
String sModel=ef.getAttribute(ExifInterface.TAG_ORIENTATION);
int rotate = 0;
switch (Integer.valueOf(sModel)){
case 3:
rotate = 180;
break;
case 6:
rotate = 90;
break;
case 8:
rotate = -90;
break;
}
// 建立操做圖片用的matrix對象
Matrix matrix = new Matrix();
matrix.postRotate(rotate);
Bitmap resizedBitmap = Bitmap.createBitmap(myBitmap, 0, 0, myBitmap.getWidth(), myBitmap.getHeight(), matrix, true);
這種方法弊端是比較消耗內存
(2)對於沒法從圖像數據中找到旋轉角度的。去除設置路徑語句,onActivityResult(int requestCode, int resultCode, Intent data)回調方法中,對data作非空判斷,data不爲空,經過對data取值可獲得圖片。圖片方向正確。
(3)以上兩種方法都不奏效的。須要添加圖片方向確認界面。而且記住用戶設置的旋轉角度。
3.部分手機設置夜間場景時不支持Camera.Parameters.SCENE_MODE_NIGHT參數
部分手機設置夜間場景時不支持Camera.Parameters.SCENE_MODE_NIGHT參數,如魅族M040就只能用「night-shot」進行夜間場景的設置,若是調用Camera.Parameters.SCENE_MODE_NIGHT進行設置時會拋出異常致使程序crash。
解決策略:
用Camera.Parameters.getSupportedSceneModes()方法得到手機能夠設置的所有場景參數,而後進行對比,若是「night」在該集合中再進行相關設置。
4.相機Parameter對象中感光度API: parameter.get(「iso-values」)返回集合爲null, 致使沒法經過該方法得到的集合值進行ISO感光度的設置。
三星 9300手機在framework層中的android.hardware.Parameters中不提供iso支持值得得到。
解決策略:
在調用這個集合值前會進行空值判斷,如if(parameter.get(「iso-values」).isEmpty())
9300不用調用該方法獲取,9300的可支持設置的值有:auto,100,200,400,800;
便可調用Parameters.set(「iso」,」auto」);
Parameters.set(「iso」,」100″);
Parameters.set(「iso」,」200″);
Parameters.set(「iso」,」400″);
Parameters.set(「iso」,」800″);
其中的任一方法進行感光度的設置。
【總結】
相機系統在機型適配時問題是比較多的。尤爲是作相機app的時候,要考慮周全camera系統,andriod版本,機型硬件配置等方面會出現的問題。不過這些惱人的問題,如今有了更好的解決方案了。
_______________________________________________________________________________________
騰訊優測是專業的移動雲測試平臺,爲應用、遊戲、H5混合應用的研發團隊提供產品質量檢測與問題解決服務。不只在線上平臺提供自動化兼容性測試、雲手機遠程租用與調試、漏洞分析、自動化測試工具Xtest等多種質量檢測工具,更爲VIP客戶配備了專家團隊提供定製化綜合測試解決方案。app