自定義Camera--方向問題

android:screenOrientation屬性

官方文檔解釋

  • unspeciied, 默認(rèn)值 由系統(tǒng)決定,不同的手機(jī)可能不同
  • behind 與前一個(gè)Activity方向一致
  • landscape 強(qiáng)制橫屏(手機(jī)自然位置右側(cè)向上)
  • portrait 強(qiáng)制豎屏(手機(jī)自然位置)
  • sensor 隨著設(shè)備的旋轉(zhuǎn)而旋轉(zhuǎn),但是一般手機(jī)不會(huì)4個(gè)方向都旋轉(zhuǎn)
  • fullSensor 4個(gè)方向都會(huì)旋轉(zhuǎn)
  • nosensor 方向傳感器被忽略,頁面不會(huì)根據(jù)手機(jī)旋轉(zhuǎn)而發(fā)生改變
  • user 用戶自己設(shè)定

其他可自行查看官方文檔

引言

當(dāng)我們自定義相機(jī)APP的時(shí)候,Camera不設(shè)置setDisplayOrientation,APP頁面也不設(shè)置屏幕方向時(shí),所得圖像。

Preview圖像隨著屏幕不同而不同

相機(jī)傳感器的方向

Suppose a back-facing camera sensor is mounted inlandscape and the top side of the camera sensor is aligned with the right edge of the display in natural orientation
假設(shè)后置相機(jī)的傳感器是被水平安裝的,并且相機(jī)傳感器的頂部與自然狀態(tài)下手機(jī)的右邊緣對(duì)齊。

這也就是為什么我們橫放手機(jī)(右側(cè)向上時(shí))拍的照片和我們?nèi)庋劭吹降姆较蛞恢隆?/p>

預(yù)覽的方向

如果我們想要在手機(jī)不同的旋轉(zhuǎn)角度上,得到的預(yù)覽圖像都和我們?nèi)庋鬯姷囊恢?,則需要旋轉(zhuǎn)preview frames,所用的方法是setDisplayOrientation 設(shè)置的角度官方文檔也有詳細(xì)的解釋
官方文檔解釋

設(shè)置displayOrientation之后,preview frames旋轉(zhuǎn)角度

上述情況都是,手機(jī)屏幕可以隨著手機(jī)放置的位置旋轉(zhuǎn)而改變的情況。但是我們手機(jī)APP一般都是豎屏或者橫屏固定的。這種情況是什么樣的呢?

當(dāng)我們固定屏幕時(shí),旋轉(zhuǎn)的角度也就固定,無論我們?cè)趺礃臃D(zhuǎn)屏幕,拍到的圖像方向一致,preview時(shí)旋轉(zhuǎn)的角度也就一定的。

生成圖片的方向

setDisplayOrientation只改變預(yù)覽圖像的方向,不會(huì)改變圖像本身的方向,所以我們?cè)诒4娴臅r(shí)候,需要旋轉(zhuǎn)圖像角度來得到正確方向的照片

  • 方法1:

通過圖片矩陣旋轉(zhuǎn)得到一個(gè)新的bitmap, 旋轉(zhuǎn)角度即為我們預(yù)覽時(shí)旋轉(zhuǎn)的角度。 需要加載到內(nèi)存,處理大圖片時(shí),如果系統(tǒng)內(nèi)存不足,容易閃退

  • 方法2:

通過ExifInterface來設(shè)置方向,但是該類只支持

JPEG, DNG, CR2, NEF, NRW, ARW, RW2, ORF, PEF, SRW and RAF.
不支持png

這種方式,不能真正改變圖片的屬性,加載到ImageView的時(shí)候,還是需要做矩陣旋轉(zhuǎn)

  • 方法3:

設(shè)置Camera的parameterssetRotation() 該方法影響的是通過pictureCallback返回的圖片,即我們所得到的byteArray方向就是翻轉(zhuǎn)正確的了。
這種方法得到的圖片矩陣就直接是正確的,后續(xù)不需要再做額外的旋轉(zhuǎn)處理了
官方文檔解釋
但是這里有一個(gè)問題,如果手機(jī)應(yīng)該是豎屏,我們?cè)O(shè)置了相應(yīng)的旋轉(zhuǎn)角度,但我們?nèi)绻麢M屏拍照的時(shí)候圖片也是翻轉(zhuǎn)了相同的角度,則我們得到圖片,就不是一個(gè)正的像,而需要我們橫屏看時(shí),是正的像。那么這樣就有問題了。

發(fā)現(xiàn)個(gè)奇葩的問題,我用小米note測(cè)試的時(shí)候,使用setRotation不會(huì)改變ExifInterface的方法,但是用三星S7和小米mix2時(shí)發(fā)現(xiàn)是改變了,在用ImageView去顯示時(shí),還需要旋轉(zhuǎn)相應(yīng)的角度

總結(jié):

當(dāng)然我們監(jiān)聽屏幕的旋轉(zhuǎn)OrientationEventListener操作,可以在拍照之前實(shí)時(shí)設(shè)置設(shè)置Camera的parameterssetRotation(),也可以通過ExifInterface來設(shè)置方向,實(shí)現(xiàn)保存正確方向的圖片

顯示圖片

它是按照?qǐng)D片矩陣的排列方式來顯示的。上面講述的通過ExifInterface做過旋轉(zhuǎn)處理,則展示的時(shí)候需要再次旋轉(zhuǎn),但如果直接作用于圖片矩陣排列的話,則直接展示即可

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 標(biāo)簽(空格分隔):Android Camera 相機(jī) 圖像方向 圖像大小 【注】本文所提到的 Camera 均為 ...
    koguma閱讀 18,441評(píng)論 5 47
  • Android中開發(fā)相機(jī)的兩種方式Android系統(tǒng)提供了兩種使用手機(jī)相機(jī)資源實(shí)現(xiàn)拍攝功能的方法,一種是直接通過I...
    開發(fā)者也閱讀 3,126評(píng)論 0 14
  • 情景 開發(fā)過程中,經(jīng)常會(huì)遇到自定義開發(fā)相機(jī)。下面詳細(xì)介紹: Android中開發(fā)相機(jī)的兩種方式 Android系統(tǒng)...
    開發(fā)者也閱讀 1,753評(píng)論 0 3
  • 彭彭說:今天在整個(gè)完結(jié)篇的時(shí)候也應(yīng)和今天彭彭選擇的這些點(diǎn),那我推薦一篇文章,可能大家以前看過類似的一個(gè)主題,那這篇...
    Yolanda_Hu閱讀 187評(píng)論 0 0
  • 記錄反思 三個(gè)目標(biāo)完成兩個(gè)。 豆瓣打卡未完成,存在完美主義情節(jié),想做好,查看了其他伙伴的格式,編寫了自己金句及反思...
    冬梅姐自我管理閱讀 89評(píng)論 0 0

友情鏈接更多精彩內(nèi)容