這幾天在改前置攝像頭,剛才看了csdn上關於此問題的熱烈討論,未得出最終結論。我覺得此問題還是有最優解的。
csdn android版主yiyaaixuexi 認為,前置camera要求: 縮略圖和照片一致,並且與取景相反。 也就是在照相的瞬間,會翻折一次。剛剛拿iphone測試了一下,也是如此。
我用nokia測試,也是如此,但這樣有一個問題,就是側拿手機拍照時,縮略圖里的人倒立。修改縮略圖,使之與preview一致、與照片相反,問題就解決了。
實際這個問題有四個像:實像,preview,縮略圖,照片;preview是照相時拍攝者在設備上看到的動態畫面,縮略圖是按下快門后定格的畫面,照片是最終存儲的文件。
現在主流設備如yiyaaixuexi所說,是preview與實像相反,而縮略圖、照片與實像相同。這樣的設計解決了以下兩個問題:預覽時的鏡像效果,存儲后圖像正向、文字正常。但造成我前面提到的問題:預覽畫面和按下快門后的“預覽圖”(縮略圖)反向,在側機時表現尤為明顯。解決方法很簡單,把縮略圖改成與實像相反。
剛剛看了高富帥朋友的蘋果手機,蘋果的縮略圖雖與照片一致,但它用另一種方式解決了橫放手機縮略圖與preview倒立的問題:當橫放手機時,通過Gsensor感應,旋轉縮略圖窗口。但是,這里還是有個bug!!!就是如果我將手機平放在桌上,此時Gsensor對XY軸感應失效,橫着拍人時,結果preview與縮略圖是上下反向的。因此,修改縮略圖,使之與preview一致仍是目前的最優解。
-----------------------------------------------------------------------------------------------------------------
抱歉,今天想了下,發現修改縮略圖使之與preview一致這種做法是不行的。因為當用戶點擊縮略圖查看大圖時,會產生嚴重的不適(圖片被水平翻轉了),在側拍時尤為明顯。所以還是應該遵循縮略圖與最終存儲圖一致的原則。暫時沒有想到比蘋果那種方法更好的方案。
總結這兩天的實驗,前置攝像頭有一個難題,即下述三個需求不可能同時滿足:
1,預覽時的鏡面效果。
2,最終保存的圖片與實景一致。
3,預覽圖與保存圖(以及縮略圖)一致。
在沒有Gsensor的設備上,一般的做法是完全舍棄第三個需求,即水平翻轉預覽圖,保存圖、縮略圖與實圖相同,如Nokia N78。
有Gsensor的設備,可以在滿足前兩個條件的基礎上,部分地滿足第三個條件。蘋果手機的做法是,當手機被橫置時(Gsensor y軸讀數的絕對值大),把保存圖(以及縮略圖)旋轉(不是翻轉)180度,這樣雖沒有做到需求3(預覽圖與保存圖(以及縮略圖)一致),但至少使得用戶在拿起手機側拍時不會發覺預覽圖(或點擊預覽圖得到的大圖)和preview是上下顛倒的。但如果用戶將手機放在桌上,Gsensor就無用武之地,照片也不會被旋轉,此時若用戶橫拍,則又會出現倒立的效果圖。
------------------------------------------------------------------------------------------------------
在android攝像頭應用Camera.java中,有這樣一句話Util.setRotationParameter(mParameters, mCameraId, mOrientation);
類Util中的setRotationParameter函數設置了前置攝像頭拍攝圖的保存方向,觀察這個函數,會發現其與后置攝像頭的差別在於90°與270°角拍攝時的處理。從這種處理中也可以看出,當硬件設計者把攝像頭按某個方向安放在設備上時,設備的“底邊”就已經確定,詳見我的為什么鏡面成像是左右反而不是上下反(從前置攝像頭說起)一文。