騰訊優測 總監 雷彬
【引言】
如果你不想随時扛着單反和三腳架去抓拍生活的點滴故事,卻仍然希望能拍到品質很高效果很好的照片。如果你不想因為拍照的失誤而錯過重要的瞬間。如果你手上有一部安卓手機,并且安裝了一款非常不錯的相機app,你的願望就能實作。
用手機記錄生活和身邊的風景,已經漸漸成為了一種生活方式。随着手機使用者對拍照品質的要求日益提高,各個手機廠商在相機系統上更是大做文章,競争激烈。是以相機系統的各種機型适配問題,可以說是奇葩不斷,匪夷所思,攻城獅們都驚呆了!
本文就讨論一下如何提升android相機産品品質,為使用者拍出高品質的照片。
【Camera系統原理及Android相機成像】
1.Android camera系統介紹
對于做相機産品的攻城獅來說,距離我們最近的相機相關的部分就是Android Camera系統了。我們就先介紹一下我們又愛又恨的Android Camera系統。
(1)Camera系統結構
Andriod 照相機的基本層次結構
Andriod Camera 系統結構
自下而上,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系統資料流
當圖像資料出現問題的時候,我們需要知道資料流的來龍去脈,找到關鍵子產品,查出問題的根源。
圖檔預覽的資料流
拍照的資料流
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客戶配備了專家團隊提供定制化綜合測試解決方案。